• AJAX学习总结+Axios异步框架+Filter拦截器学习+JSON介绍+Listener监听器介绍


    壹、AJAX 

    一、AJAX介绍

    AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML

    AJAX作用:

    1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据。(原先是将Servlet中的数据存到request域中然后再转发到JSP中进行展示,现在使用了AJAX和服务器进行通信,可以使用HTML+AJAX来替换JSP页面,意思就是Servlet里的数据通过AJAX可以发送给前端html中的javascript即可进行展示)

    2. 异步交互:在不重新加载整个页面的情况下,雨服务器交换数据并更新部分网页的技术,例如联想搜索。

    二、AJAX快速入门

     第1步:创建核心对象代码:

    1. var xhttp;
    2. if(window.XMLHttpRequest){
    3. xhttp = new XMLHttpRequest(); //获取xttp核心对象
    4. }else{
    5. xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    6. }

    第2步:发送请求代码:

    1. xhttp.open("GET","http://localhost:端口号/项目名/service文件名");
    2. xhttp.send();

    第3步: 获取响应代码:

    1. xhttp.onreadystatechange = function (){
    2. if(this.readyState == 4 && this.status == 200){
    3. alert(this.responseText); //执行代码
    4. }
    5. };

    在webapp下创建01-ajax-demo1.html,在里面写入如下java script代码,项目的名字是filter-demo,代码整合如下:

    1. <script>
    2. //1.创建核心对象
    3. var xhttp;
    4. if(window.XMLHttpRequest){
    5. xhttp = new XMLHttpRequest();
    6. }else{
    7. xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    8. }
    9. //2.发送请求
    10. xhttp.open("GET","http://localhost:8080/filter-demo/ajaxServlet");
    11. xhttp.send();
    12. //3.获取响应
    13. xhttp.onreadystatechange = function (){
    14. if(this.readyState == 4 && this.status == 200){
    15. alert(this.responseText);
    16. }
    17. };
    18. </script>

    下面是AJAX的教程: 

    三、案例

    需求:在完成用户注册时,当用户名输入框失去焦点时,校验用户名是否在数据库已存在。

     

    先在java-servlet下创建一个SelectUserServlet类,写入如下代码:

    1. @WebServlet("/selectUserServlet")
    2. public class SelectUserServlet extends HttpServlet {
    3. @Override
    4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    5. String username = req.getParameter("username");//1. 接收用户名
    6. boolean flag = true;//2. 响应标记,假设永远为true
    7. resp.getWriter().write(""+flag);
    8. }
    9. @Override
    10. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    11. super.doGet(req, resp);
    12. }
    13. }

    register.html写入如下代码:

    1. <script>
    2. document.getElementById("username").onblur = function(){ //1. 给用户名输入框绑定,失去焦点事件
    3. //2.发送ajax请求
    4. var username = this.value;//获取用户名的值
    5. //2.1. 创建核心对象xhttp
    6. var xhttp;
    7. if(window.XMLHttpRequest){
    8. xhttp = new XMLHttpRequest();
    9. }else{
    10. xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    11. }
    12. //2.2. 发送请求
    13. xhttp.open("GET","http://localhost:8080/filter-demo/selectUserServlet?username="+username); //带有参数要加上参数,同时类名要改
    14. xhttp.send();
    15. //2.3. 获取响应
    16. xhttp.onreadystatechange = function (){
    17. if(this.readyState == 4 && this.status == 200){
    18. if(this.responseText=="true"){ //用户民存在,显示提示信息
    19. document.getElementById("username_err").style.display='';
    20. }else{
    21. document.getElementById("username_err").style.display='none';//用户名不存在,清除提示信息
    22. }
    23. }
    24. };
    25. }
    26. </script>

    四、Axios异步框架

    Axios对原生的AJAX进行封装,简化书写

    官网:https://www,axios-http.cn

    axious({ 里面这一部分负责发送请求,指定发送方式和url }).then( ( 这里面定义一个返回参数resp ){ data是真正返回的结果 } )

    赋值axios的原码粘贴到webapp的js包下,同时创建一个新的html文件:

    第1步:引入axios源码文件,在标签里写如下代码:

    <script src="js/axios-0.18.0.js"></script>

    第2步:分别响应Get和Post请求的数据:

    1. <script>
    2. //1.get
    3. /*axios({
    4. method:"get",
    5. url:"http://localhost:8080/filter-demo/axiosServlet?username=zhangsan"
    6. }).then(function(resp){
    7. alert(resp.data);
    8. })*/
    9. axios({
    10. method:"post",
    11. url:"http://localhost:8080/filter-demo/axiosServlet",
    12. data : "username=zhangsan"
    13. }).then(function(resp){
    14. alert(resp.data);
    15. });
    16. </script>

    1. axios.get("http://localhost:8080/filter-demo/axiosServlet?username=zhangsan").then(function(resp){
    2. alert(resp.data);
    3. })
    4. axios.post("http://localhost:8080/filter-demo/axiosServlet","username=zhangsan").then(function(resp){
    5. alert(resp.data);
    6. });

    五、JSON

    JSON(JavaScript Object Notation):JavaScript对象表示法。

    键必须要加引号。

    JSON基础语法:

    1. <body>
    2. var json{
    3. "name":"zhangsan",
    4. "age":23,
    5. "addr":["北京","上海","西安"]
    6. };
    7. <script>
    8. alert(json.name);
    9. </script>
    10. </body>

    请求数据:JSON字符串转为Java对象

    响应数据:Java对象转为JSON字符串

    1. 导入坐标

    1. <dependency>
    2. <groupId>com.alibaba</groupId>
    3. <artifactId>fastjson</artifactId>
    4. <version>1.2.62</version>
    5. </dependency>

    2. Java对象转JSON

    String jsonStr = JSON.toJSONString(obj);

    3. JSON字符串转Java对象

    User user = JSOON.parseObject(jsonStr,User.class);

     下面是具体实现:

    1. public class FastJsonDemo {
    2. public static void main(String argv[]) {
    3. // 1.将Java对象转为Json字符串
    4. User user = new User();
    5. user.setId(1);
    6. user.setUsername("zhangsan");
    7. user.setPassword("123");
    8. String jsonString = JSON.toJSONString(user); //toJSONString方法
    9. System.out.println(jsonString);
    10. // 2.将JSON字符串转为Java对象
    11. User u = JSON.parseObject("{\"id\":1,\"password\":\"123\",\"username\":\"zhangsan\"}", User.class);
    12. System.out.println(u);
    13. }
    14. }

    六、综合案例

     在service中创建SelectAllServlet类编写如下代码:

    1. @WebServlet("/selectAllServlet")
    2. public class SelectAllServlet extends HttpServlet {
    3. private BrandService brandService = new BrandService();
    4. @Override
    5. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    6. //1. 调用哪个Service查询
    7. List<Brand> brands = brandService.selectAll();
    8. //2 将集合转换为JSON数据,序列化
    9. String jsonString = JSON.toJSONString(brands);
    10. //3. 响应数据
    11. resp.setContentType("text/html;charset=utf-8");//处理中文
    12. resp.getWriter().write(jsonString);
    13. }
    14. @Override
    15. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    16. this.doPost(req, resp);
    17. }
    18. }

     注意几个点:1.url必须要填的是web层写的那个selectAllServlet,否则数据可能为空。2.记得要在function里填写resp。3.记得如果想出现表格必须要加table标签。

    1. <body>
    2. <a href="addBrand.html"><input type="button" value="新增"></a><br>
    3. <table id="brandTable" border="1" cellspacing="0" width="100%"/>
    4. <script src="js/axios-0.18.0.js"></script>
    5. <script>
    6. window.onload = function(){//1. 当页面加载完成后,发送ajax请求
    7. axios({// 2. 发送ajax请求
    8. method:"get",
    9. url:"http://localhost:8080/brand-demo/selectAllServlet"
    10. }).then(function(resp){//获取数据
    11. let brands = resp.data;
    12. let tableData = "\n" +
    13. " 序号\n" +
    14. " 品牌名称\n" +
    15. " 企业名称\n" +
    16. " 排序\n" +
    17. " 品牌介绍\n" +
    18. " 状态\n" +
    19. " 操作\n" +
    20. " ";
    21. for(let i=0;i<brands.length;i++){ //遍历一次多一横,主要是为了获取数据
    22. let brand = brands[i];
    23. tableData +="\n" +
    24. " center\">\n"+
    25. " "+(i+1)+"\n" +
    26. " "+brand.brandName+"\n" +
    27. " "+brand.companyName+"\n" +
    28. " "+brand.ordered+"\n" +
    29. " "+brand.description+"\n" +
    30. " "+brand.status+"\n" +
    31. "\n" +
    32. " ";
    33. }
    34. document.getElementById("brandTable").innerHTML = tableData; //设计表格的数据,展示数据可能
    35. })
    36. }
    37. </script>
    38. </body>

    贰、Filter与Listener

     一、Filter概述、入门和执行流程

    1. 概念:Filter标示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。

    2. 作用:过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。过滤器一般用于完成一些通用的操作,比如:权限控制,统一编码处理,敏感字符处理等等...

    步骤:

    在java-web-filter下创建类FilterDemo

    在类中写下如下代码:

    1. @WebFilter("/*")
    2. public class FilterDemo implements Filter {//继承的Filter必须是java.servlet下面的包
    3. @Override
    4. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    5. System.out.println("FilterDemo...");
    6. chain.doFilter(request, response);//放行
    7. }
    8. }

    第1步:实现类,实现Filter接口,并重写其所有方法

    1. public class FilterDemo implements Filter{
    2. public void init(FilterConfig filterConfig)
    3. public void doFilter(ServletRequest request)
    4. public void destroy(){}
    5. }

     第2步:配置Filter拦截资源的路径:在类上定义@WebFilter注解,表示对哪些页面进行拦截:

    1. @WebFilter("/*")
    2. public class FilterDemo implemens Filter{}

     第3步:在doFilter方法中输出一句话,然后放行

    1. public void doFilter(ServletRequest request,)
    2. {
    3. System.out.println("filter被执行了...");
    4. chain.doFilter(request,response);
    5. }

     注意:在doFilter放行后也可以写代码,执行放行后的逻辑。

    二、Filter拦截路径配置&过滤器链

    1. 拦截路径配置:写在@WebFilter注解里的路径会被拦截:

    2. 过滤器链:配置多个过滤器,都会被执行,像个链条一样:

    注意:先执行1,后执行2,返回来后,是先执行2,再执行1,类似堆栈。

    输出结果:aaa - ccc - ddd - bbb

    执行的顺序:优先级按照过滤器的类名(字符串)的字典序排序。字典序更小的先执行。

    三、案例

    3.1 查询所有

    在java-web下创建LoginFilter类:

    1. @WebFilter("/*")
    2. public class LoginFilter implements Filter {//继承的Filter必须是java.servlet下面的包
    3. @Override
    4. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    5. //首先判断session中是否有user
    6. HttpServletRequest req = (HttpServletRequest) request;
    7. HttpSession session = req.getSession();
    8. Object user = session.getAttribute("user");
    9. if(user != null){//判断user是否为null,不为null用户登录过
    10. chain.doFilter(request, response);//放行
    11. }else{//没登录,拦截跳转到登录页面
    12. req.setAttribute("login_msg","您尚未登录!");
    13. req.getRequestDispatcher("/login.jsp").forward(req,response);
    14. }
    15. }
    16. @Override
    17. public void init(FilterConfig filterConfig) throws ServletException {
    18. }
    19. @Override
    20. public void destroy() {
    21. }
    22. }

    出现问题:将css样式都给拦截了:

    因此要将登陆和注册的资源全部放行:

    1. //判断访问的资源路径是否和登录注册相关
    2. String[] urls = {"/login.jsp","/imgs/","/css/","loginServlet","register.jsp","regiserServlet","checkCodeServlet"};
    3. String url = req.getRequestURL().toString();//获取当前访问的资源路径
    4. for(String u : urls){
    5. if(url.contains(u)) { //如果访问的url包含上面
    6. chain.doFilter(request, response);//放行
    7. return; //退出
    8. }
    9. }

    3.2 新增品牌

    在java-web下创建addServlet写入如下代码:

    注意:resp.getWriter().write("success");这里的success会确实返回ajax用以判断,要注意接收的数据是JSON格式,要转化为Java对象。

    1. @WebServlet("/addServlet")
    2. public class addServlet extends HttpServlet {
    3. private BrandService brandService = new BrandService();
    4. @Override
    5. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    6. //接收数据
    7. BufferedReader br = req.getReader();
    8. String Params = br.readLine();
    9. //将JSON字符转化为Java对象
    10. Brand brand = JSON.parseObject(Params, Brand.class);
    11. //调用service添加
    12. brandService.add(brand);
    13. //响应成功标识
    14. resp.getWriter().write("success");
    15. }
    16. @Override
    17. protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    18. this.doGet(req,resp);
    19. }
    20. }

     在addBrand.html中写入如下代码:

    注意:let status = document.getElementsByName("status");这段和前面的有些差别是通过Name来获取元素。查看状态时是看是否有checked标识,再通过value来判断选项。resp是web端返回的信息,用于判断。存疑:formData又是如何给到前端更新的?

    1. <script src="js/axios-0.18.0.js"></script>
    2. <script>
    3. //1.给按钮绑定一个单机事件
    4. document.getElementById("btn").onclick = function() {
    5. //将表单的数据转化为json
    6. var formData={
    7. brandName:"",
    8. companyName:"",
    9. ordered:"",
    10. description:"",
    11. status:"",
    12. };
    13. //获取表单数据
    14. let brandName = document.getElementById("brandName").value;
    15. formData.brandName = brandName;
    16. let companyName = document.getElementById("companyName").value;
    17. formData.companyName = companyName;
    18. let ordered = document.getElementById("ordered").value;
    19. formData.ordered = ordered;
    20. let description = document.getElementById("description").value;
    21. formData.description = description;
    22. let status = document.getElementsByName("status");
    23. for(let i=0;i<status.length;i++)
    24. {
    25. if(status[i].checked){ //被选中的checked属性为true
    26. formData.status = status[i].value; //value 0是禁用 1是启用
    27. }
    28. }
    29. console.log(formData);
    30. //2.发送ajax请求
    31. axios({
    32. method: "post",
    33. url:"http://localhost:8080/brand-demo/addServlet",
    34. data:formData
    35. }).then(function(resp){
    36. //判断响应数据是否为success
    37. if(resp.data =="success"){
    38. location.href="http://localhost:8080/brand-demo/brand.html";
    39. }
    40. })
    41. }
    42. </script>

    四、Listener

    Listener表示监听器,是JavaWeb三大组件之一。

    监听器可以监听application,session,request三个属性创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。

    在java-web-listener下创建ContextLoaderListener,写入如下代码即可:

    1. @WebListener
    2. public class ContextLoaderListener implements ServletContextListener {
    3. @Override
    4. public void contextInitialized(ServletContextEvent sce) {
    5. System.out.println("ContextLoaderListener...");
    6. }
    7. @Override
    8. public void contextDestroyed(ServletContextEvent sce) {
    9. }
    10. }

    叁、学习总结

    一、学习复盘

    1. 查询数据原理:BrandMapper和BrandMapper.xml其实是在同一个目录下。mybatis-config.xml主要负责链接数据库。在BrandMapper里写了SQL语句,主要提供同数据库的交互,会将查询结果返回。在Service层中通过SqlSessionFactory获取SqlSession对象,然后再获得BrandMapper的对象,就可以直接通过对象来调用查询方法返回结果。web层创建了service的对象,于是可以直接通过调用方法来获取结果。

    二、面试真题

    三、常见问题
     

  • 相关阅读:
    并查集快速合并
    .NET中的数组在内存中如何布局?
    二叉树——堆的排序 TOP-K算法
    Elasticsearch mapping
    Java项目基于docker 部署配置
    基础知识java
    牛亚男:基于多Domain多任务学习框架和Transformer,搭建快精排模型
    【无标题】
    网络编程【TCP单向通信、TCP双向通信、一对多应用、一对多聊天服务器】(二)-全面详解(学习总结---从入门到深化)
    mysql8.0 服务器和服务器启动程序 客户端程序
  • 原文地址:https://blog.csdn.net/RuanFun/article/details/132777839