Javaweb入门系列8、Filter&Listener&Ajax

1.Filter

表示过滤器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求==拦截==下来,从而实现一些特殊的功能。

@WebFilter("/*")//拦截路径
publicclassFilterDemoimplementsFilter {
​
    @Override
    publicvoiddoFilter(ServletRequestrequest, ServletResponseresponse, FilterChainchain) throwsIOException, ServletException {
       
        放行前
HttpServletRequestreq= (HttpServletRequest) request;
        
        
        //判断访问资源路径是否和登录注册相关
//1,在数组中存储登陆和注册相关的资源路径
String[] urls= {"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
//2,获取当前访问的资源路径
Stringurl=req.getRequestURL().toString(); 
​
//3,遍历数组,获取到每一个需要放行的资源路径
for (Stringu : urls) {
    //4,判断当前访问的资源路径字符串是否包含要放行的的资源路径字符串
    /*
        比如当前访问的资源路径是  /brand-demo/login.jsp
        而字符串 /brand-demo/login.jsp 包含了  字符串 /login.jsp ,所以这个字符串就需要放行
    */
    if(url.contains(u)){
        //找到了,放行
        chain.doFilter(request, response);
        //break;
        return;
    }
        
        
        //1. 判断session中是否有user
        HttpSessionsession=req.getSession();
        Objectuser=session.getAttribute("user");
​
        //2. 判断user是否为null
        if(user!=null){
            // 登录过了
            /放行
            chain.doFilter(request, response);
        }else {
            // 没有登陆,存储提示信息,跳转到登录页面
​
            req.setAttribute("login_msg","您尚未登陆!");
            req.getRequestDispatcher("/login.jsp").forward(req,response);
        
        放行后
    }
​
    @Override
    publicvoidinit(FilterConfigfilterConfig) throwsServletException {
    }
​
    @Override
    publicvoiddestroy() {
    }
}
2.Listener
  • Listener 表示监听器,是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。

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

request 和 session 我们学习过。而 application 是 ServletContext 类型的对象。

ServletContext 代表整个web应用,在服务器启动的时候,tomcat会自动创建该对象。在服务器关闭时会自动销毁该对象。

ServletContextListener 接口中有以下两个方法

  • void contextInitialized(ServletContextEvent sce):ServletContext 对象被创建了会自动执行的方法

  • void contextDestroyed(ServletContextEvent sce):ServletContext 对象被销毁时会自动执行的方法

@WebListener
publicclassContextLoaderListenerimplementsServletContextListener {
    @Override
    publicvoidcontextInitialized(ServletContextEventsce) {
        //加载资源   以后在里面会加载spring框架
        System.out.println("ContextLoaderListener...");
    }
​
    @Override
    publicvoidcontextDestroyed(ServletContextEventsce) {
        //释放资源
    }
}
3.Ajax

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

我们先来说概念中的 JavaScript 和 XML,JavaScript 表明该技术和前端相关;XML 是指以此进行数据交换。而这两个我们之前都学习过。

AJAX 作用有以下两方面:

  1. 与服务器进行数据交换:通过AJAX可以给服务器发送请求,服务器将数据直接响应回给浏览器。如下图

我们先来看之前做功能的流程

2.异步交互:可以在==不重新加载整个页面==的情况下,与服务器交换数据并==更新部分网页==的技术,如:搜索联想、用户名是否可用校验,等等…

ajax代码:

<!DOCTYPEhtml>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>Title</title>
</head>
<body>
​
<script>
    //1. 创建核心对象
    varxhttp;
    if (window.XMLHttpRequest) {
        xhttp=newXMLHttpRequest();
    } else {
        // code for IE6, IE5
        xhttp=newActiveXObject("Microsoft.XMLHTTP");
    }
    //2. 发送请求
    xhttp.open("GET", "http://localhost:8080/ajax-demo/ajaxServlet");
    xhttp.send();
​
    //3. 获取响应
    xhttp.onreadystatechange=function() {
        if (this.readyState==4&&this.status==200) {
            alert(this.responseText);
        }
    };
</script>
</body>
</html>
//1. 给用户名输入框绑定 失去焦点事件
    document.getElementById("username").onblur=function (){
​
        var username=this.value();
​
        var xhttp;
        if (window.XMLHttpRequest){
            xhttp=new XMLHttpRequest();
        }else{
            //code for IE6,IE5
            xhttp=new ActiveXObject("Microsoft.XMLTYPE");
        }
​
        alert("我在这里3");
        //建立连接
​
        xhttp.open("GET","http://localhost:8080/MyWeb_war/registerServlet?username="+username);
        //发送请求
        xhttp.send();
        alert("我在这里4");
        xhttp.onreadystatechange=function (){
            alert("我在这里5");
            if(this.readyState==4&&this.status==200){
                alert("我在这里2");
                if (this.responseText=="true"){
                    document.getElementById("username_err").style.display='';
                }else {
                    document.getElementById("username_err").style.display='none';//用户名不存在
                }
​
            }
        };
    }
4.总结

前端后端交互最方便就是使用axios和JSON,只需要在HTML页面下就行

//后端接受和传递JSON
//接收
 BufferedReader reader=request.getReader();
        String str=reader.readLine();
        Household household=JSON.parseObject(str,Household.class);
//传递
 String jsonstr= JSON.toJSONString(households);
        response.setContentType("text/json;charset=utf-8");
        response.getWriter().write(jsonstr);
//前端接收和传递JSON
    document.getElementById("bu").onclick=function (){
  var hold={
    room_number:"",
    name:"",
    phone:"",
    check_in:"",
    check_out:""
  }
  hold.room_number=document.getElementById("room-number").value;
    hold.name=document.getElementById("name").value;
    hold.phone=document.getElementById("phone").value;
    hold.check_in=document.getElementById("check-in").value;
    hold.check_out=document.getElementById("check-out").value;

    axios({
    method:"post",
    url:"http://localhost:8080/Muweb1_war/RoomServlet",
    data:hold
}).then(function (resp) {
    let households=resp.data;
    for (let i=0;i<households.length;i++){
    let hold=households[i];
    let newRow = "<tr><td class='room'>"+hold.room_number+"</td>";

    for (let i = 1; i < 32; i++) {
    if (parseInt(hold.check_in)<=i&&i<parseInt(hold.check_out)){
    newRow += "<td class='booked'>客房</td>";
}else {
    newRow += "<td class='available'>空房</td>";
}
}
    newRow += "</tr>";
    $("#room-table tbody").append(newRow);
}
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QQ.哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值