0


JavaEE(2):前后端项目之间的交互

现在,在网页中通过超链接,表单就可以向后端发送请求,后端也可以正常响应内容。

以前通过表单访问后端的请求方式称为同步请求

同步请求

  1. 当网页与后端交互时,前端不能再进行其他操作
  2. 服务器端响应回来的内容,会把整个浏览器的内容覆盖掉
  3. 这种请求方式在前后端交互时,就不太友好了
  4. 现在的前后端交互请求,都是使用的是异步请求

举例说明:

前端注册网页(实现同步请求):

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <script>
  7. function checkAccount(account){
  8. //同步请求,已经被抛弃了
  9. location.href = "http://127.0.0.1:8088/dormServer/register?account="+account;
  10. }
  11. function relogin(){
  12. location.href = "http://127.0.0.1:8848/webtest/login.html";
  13. }
  14. </script>
  15. </head>
  16. <body>
  17. <form method="post">
  18. 账号:<input type="text" name="account" value="" onblur="checkAccount(this.value)"/>
  19. <span id="msgid"></span>
  20. <br/>
  21. 密码:<input type="password" name="password" value=""/> <br/>
  22. <input type="button" value="提交" onclick="relogin()"/>
  23. </form>
  24. </body>
  25. </html>
  1. 在注册界面输入好账号(已存在)后:
  2. ![](https://i-blog.csdnimg.cn/direct/d892133da18241bf8bf17dca535f46d4.png)
  3. 当鼠标焦点不在账号栏时:

页面直接被响应到的信息覆盖了,后续操作无法进行。所以同步请求就被无情抛弃了~

异步请求

  1. 同时可以做多件事情(前端与服务器交互时,不影响前端网页其他操作)
  2. 使用js中提供的XMLHttpRequest对象实现发送异步请求,和接收服务器响应
  3. 异步请求时,会出现跨域访问问题:浏览器默认不允许js对象接收来自其他服务器响应的内容。

举例说明:

  1. 将前端网页的方法中将异步代码实现:
  1. function checkAccount(account){
  2. //异步请求,使用js对象发送请求
  3. var httpobj = new XMLHttpRequest();
  4. //封装请求地址和数据
  5. httpobj.open("get","http://127.0.0.1:8088/dormServer/register?account="+account,true);
  6. //发送请求
  7. httpobj.send();
  8. //接收响应
  9. httpobj.onreadystatechange = function(){
  10. //httpobj.responseText; 获得到响应的内容
  11. document.getElementById("msgid").innerHTML = httpobj.responseText;
  12. }
  13. }

在注册界面输入好账号(已存在)后:

当鼠标焦点不在账号栏时,从后端响应回来的信息就会立刻附在账号栏后反馈给用户。

  1. 但如果有很多种需要实时为用户反馈信息的话,这种异步请求的实现代码就非常繁琐,在多个前端网页也显得非常冗余。
  2. 所以就有了axios框架去封装异步请求的代码,减少了代码的冗余。

axios

  1. axios 是一个HTTP 的网络请求库.
  2. <!-- 导入axios框架 -->
  3. <script src="js/axios.min.js"></script>
  4. 然后注册网页的前端方法中的异步请求就会变成
  1. function checkAccount(account){
  2. //axios框架对异步请求进行封装
  3. axios.get("http://127.0.0.1:8088/dormServer/register?account="+account).then((resp)=>{
  4. console.log(resp);
  5. document.getElementById("msgid").innerHTML = resp.data;//resp.data取出后端响应的内容
  6. });
  7. }
  1. 极大减少了代码的数量,增加了代码的观赏性。

跨域问题

不同服务之间进行访问

只要请求协议,域名,端口其中一项不同,就属于跨域访问

在后端过滤器中响应时,告知前端本次响应是安全的,允许跨域访问

跨域问题是一个前端问题,也可以在后端解决,也可以在前端解决

  1. 配置跨域过滤器
  1. public class CorsFilter implements Filter {
  2. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
  3. throws IOException, ServletException {
  4. HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
  5. HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
  6. //允许携带Cookie时不能设置为* 否则前端报错
  7. httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//"origin"允许所有请求跨域,前期都是自己的浏览器访问自己的服务器,也可以使用回环地址
  8. httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
  9. httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
  10. httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
  11. filterChain.doFilter(servletRequest, servletResponse);
  12. }
  13. }

在web.xml文件中配置注册跨域过滤器

  1. <!--配置允许跨域过滤器-->
  2. <filter>
  3. <filter-name>corsfilter</filter-name>
  4. <filter-class>com.ffyc.dormServer.filter.CorsFilter</filter-class>
  5. </filter>
  6. <filter-mapping>
  7. <filter-name>corsfilter</filter-name>
  8. <url-pattern>/*</url-pattern>
  9. </filter-mapping>

json

  1. json javaScript object Notation javaScript对象表示法
  2. 两种不同的语言之间如何进行数据交互(例如C语言程序 java程序之间要进行数据交互)
  3. json是一种公认的js识别的对象表示法,对于java而言就是一种特定格式的字符串
  4. 对象:{键:值,键:值} 例如:{name:jim,age:20} 集合:[{键:值,键:值},{键:值,键:值}]

模拟json转换数据格式

  1. 1、写一个SearchServlet
  1. public class SearchServlet extends HttpServlet {
  2. @Override
  3. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  4. String name = req.getParameter("name");
  5. //模拟从数据库根据名字查询学生所有信息,然后叫数据封装到一个学生对象中
  6. Student student = new Student();
  7. student.setNum(101);
  8. student.setName(name);
  9. student.setGender("男");
  10. student.setAge(20);
  11. PrintWriter printWriter = resp.getWriter();
  12. ObjectMapper objectMapper = new ObjectMapper();
  13. String jsonstr = objectMapper.writeValueAsString(student);
  14. printWriter.print(jsonstr);//打印响应一个学生对象
  15. }
  1. 2、在web.xml文件中配置 SearchServlet
  1. <servlet>
  2. <servlet-name>search</servlet-name>
  3. <servlet-class>com.ffyc.dormServer.web.SearchServlet</servlet-class>
  4. </servlet>
  5. <servlet-mapping>
  6. <servlet-name>search</servlet-name>
  7. <url-pattern>/search</url-pattern>
  8. </servlet-mapping>
  1. 在前端写一个search.html
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title></title>
  6. <!-- 导入axios框架 -->
  7. <script src="js/axios.min.js"></script>
  8. <script>
  9. function search(){
  10. var name = document.getElementById("nameid").value;
  11. axios.get("http://127.0.0.1:8088/dormServer/search?name="+name).then((resp)=>{
  12. if(resp.data.code == 200){
  13. console.log(resp.data);
  14. alert(resp.data.massage);
  15. document.getElementById("numid").innerHTML = resp.data.data.num;
  16. document.getElementById("nameid1").innerHTML = resp.data.data.name;
  17. document.getElementById("genderid").innerHTML = resp.data.data.gender;
  18. document.getElementById("ageid").innerHTML = resp.data.data.age;
  19. }else if(resp.data.code == 500){
  20. alert(resp.data.massage);
  21. }
  22. });
  23. }
  24. </script>
  25. </head>
  26. <body>
  27. <input type="text" id="nameid"/>
  28. <input type="button" value="搜索" onclick="search()"/>
  29. <div>
  30. 学号:<span id="numid"></span>
  31. 姓名:<span id="nameid1"></span>
  32. 性别:<span id="genderid"></span>
  33. 年龄:<span id="ageid"></span>
  34. </div>
  35. </body>
  36. </html>

测试json:

  1. 打开search网页

  1. 输入张三后,后端的json就将从数据库得到的信息,转换成json的数据格式响应回前端并显示上去


本文转载自: https://blog.csdn.net/nenye233/article/details/141534061
版权归原作者 nenye233 所有, 如有侵权,请联系我们删除。

“JavaEE(2):前后端项目之间的交互”的评论:

还没有评论