今天打算模擬一個JSTL表達式出現的一個問題,結果想實現一種效果——先執行servlet之后再跳轉到JSP頁面
?
下面我簡單介紹一下我實現的方式,使用的是——過濾器
過濾器:是可插入的web組件,攔截請求和響應,可以對請求和響應進行過濾(是在中間件中的東西tomcat\weblogic)
?
1、在web.xml中添加如下配置信息
<!-- 測試過濾器的使用方式 -->
<filter>
<filter-name>filterTest</filter-name>
<filter-class>hb.servlet.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filterTest</filter-name>
<!-- 下面這個url一定要配置正確,因為在系統啟動的時候會執行init()方法 -->
<url-pattern>/filter/filter.do</url-pattern>
</filter-mapping>
?
2、編寫一個類繼承Filter 接口,實現過濾器的功能
package hb.servlet.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import org.apache.log4j.Logger;
public class MyFilter implements Filter {
private static Logger log = Logger.getLogger(MyFilter.class);
public void destroy() {
log.info("destroy filter");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filter) throws IOException, ServletException {
log.info("doFilter filter");
request.setAttribute("abc", "huangbiao");
RequestDispatcher rd = request.getRequestDispatcher("/filter/filterTest.jsp");
rd.forward(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
log.info("init filter");
}
}
?
3、在URL地址欄中輸入
http://localhost:8080/dbpool/filter/filter.do
每次輸入上面的地址都會執行doFilter()方法里的內容
?
在JSP頁面中使用EL表達式將內容顯示出來
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'filterTest.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
filterTest.jsp<br>
<%=request.getAttribute("abc") %><p>
<textarea name="textarea" style="width:100%; height:125px;" id="textarea" readonly="readonly">
<c:choose>
<c:when test="${abc != null}"><%=request.getAttribute("abc") %></c:when>
<c:otherwise></c:otherwise>
</c:choose>
</textarea>
<br>
<div><textarea name="textarea2" style="width:100%; height:125px;" id="textarea2" readonly="readonly"><c:choose><c:when test="${abc != null}"><%=request.getAttribute("abc") %></c:when><c:otherwise></c:otherwise></c:choose></textarea></div>
</body>
</html>
會發現一種很奇怪的現象,兩種textarea標簽里面的內容不一樣
?
因此,在使用JSTL邏輯控件的時候,盡量不要換行,不然會出現一些意想不到的效果
?