标签:w3c pattern sep empty 忽略 end odi 查询 cte
1.项目结构如右边图所示:
controller.filter包下面定义2个过滤器,EncodingFilter 类CheckUserFilter类(后面会有一个登陆验证的过滤器的测试学习),
el包下面定义一个ElTestServlet类(el表达式使用,处理用户请求,把servlet中设定的数据读取到eltest.jsp页面中显示)和LoginSuccessServlet类,处理用户登陆信息
user包下面定义user实体类(登陆验证过滤器使用)
eltest.jsp: el表达式和JSTL表达式使用测试页面,把ElTestServlet类中的数据显示到页面上
error.jsp 和success.jsp页面是测试登陆验证过滤器的测试使用的
2.el表达式和jstl标签 及过滤器部分 (如果web.xml中不配置过滤器,就随便用,忽略过滤器)
针对ElTestServlet代码中的注释,先忽略过滤器的作用
先来看一下运行的效果:
ElTestServlet类定义如下:
package el; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import user.User; public class ElTestServlet extends HttpServlet { private static final long serialVersionUID = -831893763619493234L; @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setAttribute("name", "requsetVar"); //在serlvet服务代码中,对request对象了一个属性,名字是name,值是requestVar
req.getSession().setAttribute("name", "sessionVar");
//在session对象中同样设置一个name属性,值是sessionVar,到时候看看eltest.jsp页面中获取到的是哪一个name
User user1 = new User("zhangsan", 1, "18855555555"); //创建2个user对象
User user2 = new User("lisi", 0, "18866666666");
List<User> users = new ArrayList<User>();
users.add(user1); users.add(user2);
req.setAttribute("yonghu", users);//把装有多个User对象的list集合装到request对象中去
req.setAttribute("user1", user1);//把一个User对象装到request对象中
req.getRequestDispatcher("eltest.jsp").forward(req, resp); //把客户端请求转发到
}
}
EncodingFilter过滤器定义:
package controller.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class EncodingFilter implements Filter{ private String charset = ""; @Override public void destroy() { System.out.println("-------------过滤器销毁-----------"); } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { if(charset!=null && charset.trim().length()!=0){ req.setCharacterEncoding(charset);//设定请求页面编码格式 resp.setCharacterEncoding(charset);//设定响应页面编码格式 } //以下重要!!!如果不写,则只有这一个过滤器工作,后面的过滤器,web请求都无效 chain.doFilter(req, resp);//如果还有过滤器,就进入下一个过滤器,没有,进入调用web资源的过程 } @Override public void init(FilterConfig filterConfig) throws ServletException { // 在过滤器初始化的时候获取配置文件中指定的字符集参数! String initCharset = filterConfig.getInitParameter("charset"); if(initCharset!=null && initCharset.trim().length()!=0){ //如果从web.xml读取到的配置中的charset不为空,就赋值给当前过滤器的属性charset charset = initCharset; //动态赋值,配置文件中是什么编码,此处得到的是什么编码,不能在过滤器里边把编码格式写死 System.out.println("获取到配置文件中的字符编码格式为:"+charset); System.out.println("--------初始化完成--------"); } } }
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>
部分输出结果如下:
可以看到,当四个作用域对象具有相同的属性名的属性时,如果不指定作用域,那么用el表达式获取到的是pageContext对象中的name属性的值,
如果取值时用${sessionScope.name}取到的才是session对象中的name属性的值。输出这样的结果,是因为,el表达式获取属性时,会从pageContex,request,session,application四个作用域对象中依次去查找,且优先从pageContext中去查找。如果pageContex中找到了,就拿过来用,如果pageContex中没有,就依次往更大的范围内去找,如果application对象中也没有,就什么也没取到,如果要在jsp页面上输出该属性的值,将会没有显示。
ElTestServlet和EncodingFilter 配置(Web.xml)
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="3.0" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> 7 <display-name></display-name> 8 <welcome-file-list> 9 <welcome-file>index.jsp</welcome-file> 10 </welcome-file-list> 11 12 <!--ElTestServlet配置 --> 13 <servlet> 14 <servlet-name>ElTestServlet</servlet-name> 15 <servlet-class>el.ElTestServlet</servlet-class> 16 </servlet> 17 <servlet-mapping> 18 <servlet-name>ElTestServlet</servlet-name> 19 <url-pattern>/eltest</url-pattern> 20 </servlet-mapping> 21 22 <!-- Encoding过滤器设置 url-pattern设置为*表示对所有的项目进行过滤 --> 23 <filter> 24 <filter-name>EncodingFilter</filter-name> 25 <filter-class>controller.filter.EncodingFilter</filter-class> 26 <init-param> 27 <param-name>charset</param-name> 28 <param-value>UTF-8</param-value> 29 </init-param> 30 </filter> 31 <filter-mapping> 32 <filter-name>EncodingFilter</filter-name> 33 <url-pattern>/*</url-pattern> 34 </filter-mapping> 35 36 <!-- CheckUserFilter过滤器配置 <filter-name>是指定要被过滤器拦截的servlet, 37 /eltest表示访问eltest路径下的资源时 会被过滤器拦截并处理 /*表示对该项目所有资源进行拦截过滤--> 38 <filter> 39 <filter-name>CheckUserFilter</filter-name> 40 <filter-class>controller.filter.CheckUserFilter</filter-class> 41 </filter> 42 <filter-mapping> 43 <filter-name>CheckUserFilter</filter-name> 44 <url-pattern>/success</url-pattern> 45 </filter-mapping> 46 47 <!--LoginSuccessServlet servlet配置 --> 48 <servlet> 49 <servlet-name>LoginSuccessServlet</servlet-name> 50 <!--servlet服务类: LoginSuccessServlet --> 51 <servlet-class>el.LoginSuccessServlet</servlet-class> 52 </servlet> 53 <servlet-mapping> 54 <servlet-name>LoginSuccessServlet</servlet-name> 55 <url-pattern>/success</url-pattern> 56 <!--在浏览器中输入:协议名:/主机名:端口地址/web项目名/url-pattern指定的路径名, 57 就会进入LoginSuccessServlet,执行这个类中的服务了 --> 58 </servlet-mapping> 59 60 61 62 </web-app>
在浏览器输入:http://localhost:8080/webstu5exercise/eltest 并访问
运行结果如下:
标签:w3c pattern sep empty 忽略 end odi 查询 cte
原文地址:http://www.cnblogs.com/enjoyjava/p/7657778.html