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页面上输出该属性的值,将会没有显示。

  • 相关阅读:
    Thymeleaf使用
    关闭被占用端口
    在map、model、modelAndView中存放数据 回显
    @RequestAttribute 注解
    @PathVariable、@RequestHeader、@RequestParam、@RequestBody 注解使用
    RESTful风格请求映射
    yml文件 数据回显
    JVM垃圾回收与一次线上内存泄露问题分析和解决过程
    比较java_io_Externalizable和Serializable
    关于java中的对象序列化
  • 原文地址:https://www.cnblogs.com/enjoyjava/p/7657778.html
Copyright © 2011-2022 走看看