码迷,mamicode.com
首页 > 编程语言 > 详细

JavaWebEL表达式, JSTL标签及过滤器综合学习

时间:2017-10-12 21:47:46      阅读:289      评论:0      收藏:0      [点我收藏+]

标签: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  并访问

运行结果如下:

 

JavaWebEL表达式, JSTL标签及过滤器综合学习

标签:w3c   pattern   sep   empty   忽略   end   odi   查询   cte   

原文地址:http://www.cnblogs.com/enjoyjava/p/7657778.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!