zoukankan      html  css  js  c++  java
  • JavaWeb EL表达式, JSTL标签及过滤器综合学习

     1.项目结构如右边图所示:

    (1)controller.filter包下面定义2个过滤器,EncodingFilter 类CheckUserFilter类(后面会有一个登陆验证的过滤器的测试学习),

    (2)el包下面定义一个ElTestServlet类(el表达式使用,处理用户请求,把servlet中设定的数据读取到eltest.jsp页面中显示)和LoginSuccessServlet类,处理用户登陆信息

    (3)user包下面定义user实体类(登陆验证过滤器使用)

    (4)WebRoot 根目录下: 

        1)eltest.jsp:   el表达式和JSTL表达式使用测试页面,把ElTestServlet类中的数据显示到页面上

        2)error.jsp   和success.jsp页面是测试登陆验证过滤器的测试使用的

    2.el表达式和jstl标签 及过滤器部分 (针对ElTestServlet代码中的注释,先忽略过滤器的作用 )

    3.本次学习小项目的目的:从ElTestServlet中获取数据(2个名字相同,作用域不同的变量name,一个list对象,1个user对象),

    然后在eltest.jsp页面中用EL表达式拿到并显示出来,这其中用到JSTL标签去遍历获取到的集合对象(EL表达式无法遍历集合)

    然后,在这个基础上加上过滤器的知识,也就是增加一个EncodingFilter 类,在web.xml中进行配置,再去测试就OK了

    ElTestServlet类定义如下:

     1 package el;
     2 
     3 import java.io.IOException;
     4 import java.util.ArrayList;
     5 import java.util.List;
     6 
     7 import javax.servlet.ServletException;
     8 import javax.servlet.http.HttpServlet;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 
    12 import user.User;
    13 
    14 public class ElTestServlet extends HttpServlet {
    15 
    16     private static final long serialVersionUID = -831893763619493234L;
    17 
    18     @Override
    19     protected void service(HttpServletRequest req, HttpServletResponse resp)
    20             throws ServletException, IOException {
    21         //在serlvet服务代码中,对request对象了一个属性,名字是name,值是requestVar
    22         req.setAttribute("name", "requsetVar");
    23         //在session对象中同样设置一个name属性,值是sessionVar,到时候看看eltest.jsp页面中${name}获取到的是哪一个name
    24         req.getSession().setAttribute("name", "sessionVar");
    25         //创建2个user对象
    26         User user1 = new User("张三", 1, "18855555555");
    27         User user2 = new User("李斯", 0, "18866666666");
    28         List<User> users = new ArrayList<User>();
    29         users.add(user1);
    30         users.add(user2);
    31         req.setAttribute("yonghu", users);//把装有多个User对象的list集合装到request对象中去 
    32         req.setAttribute("user1", user1);//把一个User对象装到request对象中
    33         req.getRequestDispatcher("eltest.jsp").forward(req, resp);//把客户端请求转发到eltest.jsp
    34     }
    35     
    36 }

      eltest.jsp页面:

     1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
     2 <!-- 引入jstl,设定前缀 -->
     3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
     4 
     5 <%
     6     String path = request.getContextPath();
     7     String basePath = request.getScheme() + "://"
     8             + request.getServerName() + ":" + request.getServerPort()
     9             + path + "/";
    10 %>
    11 
    12 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    13 <html>
    14 <head>
    15 <base href="<%=basePath%>">
    16 
    17 <title>My JSP 'index.jsp' starting page</title>
    18 </head>
    19 
    20 <body>
    21     1.普通方式获取参数:    <br>
    22     <%
    23         String name1 = (String) request.getAttribute("name");
    24         String name2 = (String) request.getSession().getAttribute(
    25                 "name");
    26         pageContext.setAttribute("name", "pageContextVar");
    27         application.setAttribute("name", "applicationVar");
    28     %>
    29     request对象中的name:    <%=name1%>    <br> 
    30     sesssion对象中的name:    <%=name2%>    <br><hr>
    31     2.使用el表达式获取四大作用域中的对象参数:    <br>
    32     未指定作用域时的name>>>${name}<br>     
    33      pageContext对象中的name>>>    ${pageScope.name }<br>
    34      request对象中的name>>>${requestScope.name}<br>
    35      session对象中的name>>>${sessionScope.name}<br>
    36      application对象中的name>>>    ${applicationScope.name }<br><hr>
    37      3.使用el表达式获取一个对象中的属性:<br>
    38      姓名:${user1.name }<br>
    39      性别:${user1.gender }<br>
    40      电话:${user1.phone }<br><hr>
    41      4.使用JSTL标签获取一个集合中的所有元素的属性:<br>
    42      
    43          <c:choose>
    44             <c:when test="${empty yonghu }">
    45                 没有查询到相关数据
    46             </c:when>
    47             <c:otherwise>
    48                 <table border="1px">
    49                      <tr>
    50                          <td>姓名</td>
    51                          <td>性别</td>
    52                          <td>电话</td>
    53                      </tr>
    54                      <c:forEach items="${yonghu }" var="user" >
    55                          <tr><!--把集合中的元素拿出来交给变量user,然后对user取属性值,
    56                          取到的就是servlet传过来的user对象的属性值  -->
    57                          <td>${user.name }</td>
    58                          <td> <c:if test="${user.gender==1}">男</c:if>
    59                          <c:if test="${user.gender==0}" >女</c:if>    </td>
    60                          <td>${user.phone }</td>
    61                          </tr>
    62                      </c:forEach>
    63              
    64                  </table>
    65             </c:otherwise>
    66     </c:choose>
    67 
    68 </body>
    69 </html>

     ElTestServlet和EncodingFilter 配置(Web.xml):

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     5     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
     6     <display-name></display-name>
     7     <welcome-file-list>
     8         <welcome-file>index.jsp</welcome-file>
     9     </welcome-file-list>
    10 
    11     <!--ElTestServlet配置 -->
    12     <servlet>
    13         <servlet-name>ElTestServlet</servlet-name>
    14         <servlet-class>el.ElTestServlet</servlet-class>
    15     </servlet>
    16     <servlet-mapping>
    17         <servlet-name>ElTestServlet</servlet-name>
    18         <url-pattern>/eltest</url-pattern>
    19     </servlet-mapping>
    20 
    21     <!-- Encoding过滤器设置 url-pattern设置为*表示对所有的项目进行过滤 -->
    22     <filter>
    23         <filter-name>EncodingFilter</filter-name>
    24         <filter-class>controller.filter.EncodingFilter</filter-class>
    25         <init-param>
    26             <param-name>charset</param-name>
    27             <param-value>UTF-8</param-value>
    28         </init-param>
    29     </filter>
    30     <filter-mapping>
    31         <filter-name>EncodingFilter</filter-name>
    32         <url-pattern>/*</url-pattern>
    33     </filter-mapping>
    34 
    35     <!-- CheckUserFilter过滤器配置 <filter-name>是指定要被过滤器拦截的servlet, /eltest表示访问eltest路径下的资源时 
    36         会被过滤器拦截并处理 /*表示对该项目所有资源进行拦截过滤 -->
    37     <filter>
    38         <filter-name>CheckUserFilter</filter-name>
    39         <filter-class>controller.filter.CheckUserFilter</filter-class>
    40     </filter>
    41     <filter-mapping>
    42         <filter-name>CheckUserFilter</filter-name>
    43         <url-pattern>/success</url-pattern>
    44     </filter-mapping>
    45 
    46     <!--LoginSuccessServlet servlet配置 -->
    47     <servlet>
    48         <servlet-name>LoginSuccessServlet</servlet-name>
    49         <!--servlet服务类: LoginSuccessServlet -->
    50         <servlet-class>el.LoginSuccessServlet</servlet-class>
    51     </servlet>
    52     <servlet-mapping>
    53         <servlet-name>LoginSuccessServlet</servlet-name>
    54         <url-pattern>/success</url-pattern>
    55         <!--在浏览器中输入:协议名:/主机名:端口地址/web项目名/url-pattern指定的路径名, 就会进入LoginSuccessServlet,执行这个类中的服务了 -->
    56     </servlet-mapping>
    57 
    58     <!--在浏览器中输入localhost:8080/webstu5exercise/success 如果没有过滤器,会进入到LoginSuccessServlet 
    59         这个servlet中进行请求处理,当设置了过滤器,会先进入过滤器CheckUserFilter,进行登陆验证判断,如果用户名正确,就进入下一个 过滤器直至最后一个过滤器,
           然后才会进入被拦截了的
    LoginSuccessServlet,处理其中的程序( 把页面转发到登陆成功页面:succes.jsp req.getRequestDispatcher("success.jsp").forward(req, 61 resp);),如果用户名不正确,则在过滤器里面就重定向 到error.jsp页面中去,LoginSuccessServlet根本不会执行到 if(name.equals("lch")){ 62 chain.doFilter(req, resp);//执行完,转到了eltest.jsp页面 }else { ((HttpServletResponse)resp).sendRedirect("error.jsp");//转到error.jsp 63 } --> 64 65 </web-app>

     EncodingFilter过滤器定义:

     1 package controller.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 
    12 public class EncodingFilter implements Filter{
    13 
    14     private String charset = "";
    15     @Override
    16     public void destroy() {
    17         System.out.println("-------------过滤器销毁-----------");
    18         
    19     }
    20 
    21     @Override
    22     public void doFilter(ServletRequest req, ServletResponse resp,
    23             FilterChain chain) throws IOException, ServletException {
    24         if(charset!=null && charset.trim().length()!=0){
    25             req.setCharacterEncoding(charset);//设定请求页面编码格式
    26             resp.setCharacterEncoding(charset);//设定响应页面编码格式
    27         }
    28         //以下重要!!!如果不写,则只有这一个过滤器工作,后面的过滤器,web请求都无效
    29         chain.doFilter(req, resp);//如果还有过滤器,就进入下一个过滤器,没有,进入调用web资源的过程
    30         
    31     }
    32 
    33     @Override
    34     public void init(FilterConfig filterConfig) throws ServletException {
    35         
    36         // 在过滤器初始化的时候获取配置文件中指定的字符集参数!
    37         String initCharset = filterConfig.getInitParameter("charset");
    38         if(initCharset!=null && initCharset.trim().length()!=0){
    39             //如果从web.xml读取到的配置中的charset不为空,就赋值给当前过滤器的属性charset
    40             charset = initCharset; 
    41             //动态赋值,配置文件中是什么编码,此处得到的是什么编码,不能在过滤器里边把编码格式写死    
    42             System.out.println("获取到配置文件中的字符编码格式为:"+charset);
    43             System.out.println("--------初始化完成--------");
    44         }
    45     }
    46 
    47 }

    上边几个写好并且配置好web.xml文档后,在浏览器输入:http://localhost:8080/webstu5exercise/eltest  并访问,结果如下:

      

    可以看到,当四个作用域对象具有相同的属性名的属性时,如果不指定作用域,那么用el表达式获取到的是pageContext对象中的name属性的值,

    如果取值时用${sessionScope.name}取到的才是session对象中的name属性的值。输出这样的结果,是因为,el表达式获取属性时,会从pageContex,request,session,application四个作用域对象中依次去查找,且优先从pageContext中去查找。如果pageContex中找到了,就拿过来用,如果pageContex中没有,就依次往更大的范围内去找,如果application对象中也没有,就什么也没取到,如果要在jsp页面上输出该属性的值,将会没有显示。

  • 相关阅读:
    sublime text 4 vim 插件配置
    ssh-keygen 的使用
    distribution transaction solution
    bilibili 大数据 视频下载 you-get
    Deepin 20.2.1 安装 MS SQL 2019 容器版本
    【转】使用Linux下Docker部署MSSQL并加载主机目录下的数据库
    【转】You Can Now Use OneDrive in Linux Natively Thanks to Insync
    dotnet 诊断工具安装命令
    Linux 使用 xrandr 设置屏幕分辨率
    【转】CentOS 7.9 2009 ISO 官方原版镜像下载
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/7657778.html
Copyright © 2011-2022 走看看