木舟0基础学习Java的第二十七天(JavaWeb,Jsp,jstl,el表达式,拦截器,监听器)

Jsp

Java Server Pages java服务器页面 底层为简化的Servlet 支持跨平台

Jsp使用

 

导包

import="com.io.* //如果需要导入多个包 用逗号隔开

Session

session="true"//session默认不支持 将其改为true就支持了

当页面出错时自动跳转

errorPage="error.jsp"//页面出错会跳转到error.jsp页面

在jsp中写Java

<%%>//强制要求按该格式写

例:

<%
    System.out.println(1/0);
%>

//会跳转到error.jsp页面

在jsp中写成员变量

<%! %>//要在第一个%后加!

引入jsp模板

<%@ include file="error.jsp"%>

jsp跳转servlet取值

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath(); //获取当前工程的根目录
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
%>
<html>
<head>
    <base href="<%=basePath%>"><!--这个让此文件下的路径都相对于当前工程开始-->
    <title>Title</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
%>
<jsp:forward page="ServletA">
    <jsp:param name="uname" value="张三"/>
</jsp:forward>
</body>
</html>
@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html");
        resp.setContentType("text/html;charset=UTF-8");
        String uname = req.getParameter("uname");
        resp.getWriter().println("取到a.jsp中传来的数据:"+uname);
        System.out.println(uname);
    }
}

jsp九大内置对象

pageContext:上下文对象 作用于当前页面

request:封装当前请求数据的对象 一次请求 由tomcat服务器创建

response:响应客户端信息

session:存储一次会话 将数据一次请求流转给其他请求 一个用户的不同请求共享数据

application:相当于ServletContext 存储不同用户的共享数据 将数据从一个用户流转给其他用户

out:(效率高)jsp的响应对象 相当于resp.getWrite.write()

page:当前的对象 相当于java中的this关键字

exception:异常

config:相当于ServletConfig

jstl el表达式(建议百度)

通过el表达式取值

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="com.pojo.T_Stu" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath(); //获取当前工程的根目录
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort();
%>
<html>
<head>
    <base href="<%=basePath%>"><!--这个让此文件下的路径都相对于当前工程开始-->
    <title>Title</title>
</head>
<body>
<%
    ArrayList<String> list=new ArrayList();
    list.add("黑");
    list.add("吉");
    list.add("辽");
    session.setAttribute("list",list);
    HashMap<String,Integer> map=new HashMap();
    map.put("a",10);
    map.put("b",20);
    map.put("c",30);
    session.setAttribute("map",map);
    ArrayList<T_Stu> stu=new ArrayList();
    stu.add(new T_Stu("张三","333"));
    stu.add(new T_Stu("李四","444"));
    stu.add(new T_Stu("王五","555"));
    session.setAttribute("stu",stu);
%>
${list.get(0)}${list.get(1)}${list.get(2)}
${map.a}${map.b}${map.c}
${stu}
</body>
</html>

jstl表达式

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

需要导入jar包支持

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath(); //获取当前工程的根目录
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
    <base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
    <title>Title</title>
</head>
<script src="js/jquery-3.5.1.js"></script>
<script>
    $(function () {
        $.get("AjaxServlet",{"name":"张三","age":12},
        function (data){
            alert(data)

        })
    })
</script>
<body>

</body>
</html>
@WebServlet("/AjaxServlet")
public class AjaxServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        String name = req.getParameter("name");
        String age = req.getParameter("age");
        System.out.println(name+"----"+age);
        resp.getWriter().write("AjaxServlet响应");
    }
}

优先级

pageContext request session application

拦截器

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath(); //获取当前工程的根目录
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
    <base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
    <title>Title</title>
</head>
<body>
欢迎${uname}登录
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    String path = request.getContextPath(); //获取当前工程的根目录
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; //项目url根目录
%>
<html>
<head>
    <base href="<%=basePath%>"> <!--这个让此文件下的路径都相对于当前工程开始-->
    <title>Title</title>
</head>
<body>
<form action="login" id="loginForm">
用户名:<input type="text" name="uname" id="uname">
    <button type="button" onclick="Loogin()">登录</button>
</form>
<script src="js/user.js" type="text/javascript"></script>
</body>
</html>
function Loogin() {
    var uname=document.getElementById("uname").value
    alert(uname);
    if(uname!=null&&uname.trim()!=null){
        document.getElementById("loginForm").submit();
    }
}
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("用户登录");
        String uname = req.getParameter("uname");
        System.out.println(uname);
        //判断用户名
        if("admin".equals(uname)) {
            req.getSession().setAttribute("uname", uname);
            //重定向
            resp.sendRedirect("index.jsp");
        }else{
            req.getRequestDispatcher("login.jsp").forward(req, resp);
        }
    }
}

@WebFilter("/*")
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LoginFilter初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("LoginFilter正在拦截");
        //基于Http请求的
        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;
        //filterChain.doFilter(req,resp);//放行所有
        //当用户没有登陆时 拦截请求 跳转到登录页面
        //resp.sendRedirect("login.jsp");//这段代码也是请求 会多次请求 又进到过滤器无限循环

        //指定放行页面 静态资源 登录注册页面都要放行
        //先获取请求的路径
        String uri = req.getRequestURI();
        //登录页面放行
        if(uri.contains("login.jsp")){
            filterChain.doFilter(req,resp);
            return;
        }
        //静态资源放行
        if(uri.contains("/js")||uri.contains("/css")||uri.contains("/img")||uri.contains("/html")){
            filterChain.doFilter(req,resp);
            return;
        }
        if(uri.contains("/login")){
            filterChain.doFilter(req,resp);
            return;
        }
        String uname =(String)req.getSession().getAttribute("uname");
        if(uname!=null){
            filterChain.doFilter(req,resp);
            return;
        }
        resp.sendRedirect("login.jsp");
    }

    @Override
    public void destroy() {
        System.out.println("LoginFilter销毁");
    }
}

监听器

@WebListener("/MyRequestLisenter")
public class MyRequestLisenter implements ServletRequestListener {

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        System.out.println("销毁");
        ServletRequest request = sre.getServletRequest();
        HttpServletRequest req =(HttpServletRequest) request;//必须执行这一步
        try {
            req.setCharacterEncoding("utf-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        String name = req.getParameter("name");
        String age = req.getParameter("pwd");
        System.out.println(name+"-------"+age);
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        System.out.println("初始化。。。程序运行先执行这个");
    }
}
@WebListener
public class OnlineListener implements HttpSessionListener {
    //在线人数初始化
    private Integer onlineNumber=0;
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        onlineNumber++;
        //将人数通过 se 设置到session中
        //se.getSession().setAttribute("onlineNumber", onlineNumber);
        //保证同步需要设置在servletContext作用域中
        se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        onlineNumber--;
        //将人数通过 se 设置到session中
        //se.getSession().setAttribute("onlineNumber", onlineNumber);
        //保证同步需要设置在servletContext作用域中
        se.getSession().getServletContext().setAttribute("onlineNumber", onlineNumber);
    }
}
@WebServlet("/online")
public class OnlineServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        HttpSession session = req.getSession();
        String key = req.getParameter("key");
        System.out.println(key);
        if(key!=null && "logout".equals(key)){
            session.invalidate();
            return;
        }
        Integer onlineNumber =(Integer)session.getServletContext().getAttribute("onlineNumber");
        resp.getWriter().write("<h2>当前在线人数</h2>:"+onlineNumber+"<a href='online?key=logout'>退出</a>");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值