idea servlet 前后端分离实例
第一步:在idea下建一个javaWEB工程;
第二步:新建一个工程,不需要在web下写些前端,因为想在HBuild中写前端;
第三步:在controller包下新建一个servlet,我这里命名叫Servlet1,代码如下:
protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); String name=request.getParameter("name"); System.out.println(name); PrintWriter out = response.getWriter(); try{ out.write(name); out.flush(); }catch (Exception e){ e.printStackTrace(); }finally { out.close(); } }
第三步:打开HBuilder编辑器,新建一个html项目,
index2.html的代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.2.1.min.js"></script>
<script type="text/javascript">
$(function(){
$("#btn").click(function(){
var name=$('#name').val();
if(name==""){
alert("姓名不能为空!");
return;
}
$.ajax({
url: "http://localhost:8080/servlet2_war_exploded/xxx", //向这个网址进行提交,这个网址是先运行后端后从浏览器地址栏拷贝过来的。
data: {"name": name},
type:'post',
//dataType:'json', //这一句在此处不能要,因为我这里返回的是一个string,所以要了后反而在前端收不到后端发送过来的数据。
success: function (data) {
$('#h1').text(data);
},
error: function () {
console.log("error")
}
});
});
});
</script>
</head>
<body>
<form id="form1">
请输入姓名:<input type="text" name="name" id="name"><br/>
<input type="button" name="btn" id="btn" value="提交" />
<input type="reset" name="rebtn" id="rebtn" value="重置">
</form>
<h1 id="h1"></h1>
</body>
</html>
第四步:要想后端的数据能正常返给前端,还后端还必须建一个Filter类,让它能跨域,没有这个后端的数据返不到前端。
package serviceImp; import javax.servlet.*; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class HeaderFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) servletResponse; response.setHeader("Access-Control-Allow-Origin", "*"); //解决跨域访问报错 response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); //设置过期时间 response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, client_id, uuid, Authorization"); response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // 支持HTTP 1.1. response.setHeader("Pragma", "no-cache"); // 支持HTTP 1.0. response.setHeader("Expires", "0"); filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } }
第五步:仅仅是做好上面的是不行的,还要把前端和后端用web.xml联系起来
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>HeaderFilter</filter-name> <filter-class>serviceImp.HeaderFilter</filter-class> </filter> <filter-mapping> <filter-name>HeaderFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>Servlet1</servlet-name> <servlet-class>controller.Servlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlet1</servlet-name> <url-pattern>/xxx</url-pattern> </servlet-mapping> </web-app>
第六步:先运行后端,得知后端的URL后,把它填到前端的ajax的URL中,在前端中提交数据,就可以发送到java后台;java后台处理后,就可以再返到前端了,完美解决。
参考网址:https://blog.****.net/qinyf2015/article/details/79426227
https://www.cnblogs.com/JavaMVC/articles/6943624.html