JSP 隱式對象是Web容器加載的一組類的實例。它是可以直接在JSP頁面使用的對象。分為4個主要類別:
·
輸入和輸出對象:控制頁面的輸入和輸出(request、response、out)。
·
作用域通信對象:檢索與JSP頁面的Servlet相關的信息(session、application、pageContext)。
·
Servlet對象:提供有關頁面環境的信息(page、config)。
·
錯誤對象:處理頁面中的錯誤(exception)。
1、輸入和輸出對象
1)request對象
request隱式對象表示客戶端的請求,包含了所有的請求信息。
· String getParameter(String name):根據頁面表單組件名稱獲取請求頁面提交的數據。
· String getParameterValues(String name):獲取頁面請求中一個表單組件對應多個值時的用戶的請求數據(例如復選框)。
2)response對象
response隱式對象處理JSP生成的響應, 然后將響應結果發送給客戶端。
· void setContentType(String name):設置作為響應生成的內容的類型和字符編碼。
· void sendRedirect(string name):發送一個響應給瀏覽器,指示其應請求另一個URL(重定向到另外一個URL,會丟失數據,跳轉后不再執行sendRedirect方法下面的代碼)。
3)out對象
out對象表示輸出流,此輸出流將作為請求的響應發送到客戶端,常用的方法有print()、println()和write()。
2、作用域通信對象
JSP作用域通信對象從小到大有pageContext對象、session對象、application對象。
1)pageContext對象
pageContext對象使用戶可以訪問當前頁面作用域中定義的所有隱式對象。pageContext對象最常用的方法有:
· void setAttribute(String name, Object value):以名稱/值的方式,將一個對象的值存放到pageContext中(存的值的類型為Object)。
· void getAttribute(String name):根據名稱去獲取pageContext存放對象的值(獲取的值的類型為Object)。
2)session對象
session對象表示用戶的會話狀況,用此項機制可以輕易識別每一個用戶,能保存和跟蹤用戶的會話狀態。session對象最常用的方法有:
· void setAttribute(String name, Object value):以名稱/值的方式,將一個對象的值存放到session中(存的值的類型為Object)。
· void getAttribute(String name):根據名稱去獲取session存放對象的值(獲取的值的類型為Object)。
3)application對象
application對象作用於整個應用程序,所有的客戶端窗口都可以共享該對象,從服務器開始就存在,直到服務器關閉為止。application對象最常用的方法有:
· void setAttribute(String name, Object value):以名稱/值的方式,將一個對象的值存放到application中(存的值的類型為Object)。
· void getAttribute(String name):根據名稱去獲取application存放對象的值(獲取的值的類型為Object)。
3、Servlet對象
1)page對象
page對象提供對網頁上定義的所有對象的訪問。page對象表示頁面本身,它是java.lang.Object類的一個實例。
2)config對象
config對象存儲Servlet的一些初始信息。config對象是javax.servlet.ServletConfig接口的一個實例,ServletConfig接口提供方法以檢索Servlet初始化參數。config對象表示編譯JSP頁面的Servlet初始化數據的配置。
4、錯誤對象exception
exception對象處理JSP頁面中的錯誤。printStackTrace()方法用於顯示異常的堆棧跟蹤。exception.getClass().getName()獲取異常信息。
表單驗證的示例
1)顯示頁面index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>表單提交</title> </head> <body> <form id="form1" name="form1" method="post" action="test"> <p align="center"><strong>表單提交</strong></p> <table width="331" height="147" border="1" align="center" cellpadding="0" cellspacing="0"> <tr> <td width="76" height="35">username:</td> <td width="183"> <label> <input type="text" name="userName" id="username_tf" height="20"/> </label> </td> <td width="50"> </td> </tr> <tr> <td>sex:</td> <td> <input type="radio" name="sex" value="boy"/>Boy <input type="radio" name="sex" value="girl"/>Girl </td> <td> </td> </tr> <tr> <td>address:</td> <td> <input type="text" name="address" id="address_tf" height="20"/> </td> <td> </td> </tr> <tr> <td>likes:</td> <td> <label> <input type="checkbox" name="likes" id="cb1" value="sing"/>Sing <input type="checkbox" name="likes" id="cb2" value="dance">Dance <input type="checkbox" name="likes" id="cb3" value="game">Game </label> </td> <td> </td> </tr> <tr> <td> </td> <td> <input name="" type="submit" value="提交"/> <input name="" type="reset" value="重置"> </td> <td> </td> </tr> </table> </form> </body> </html>
2)在Servlet中處理業務邏輯
package com.yyq.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by gao on 16-4-18. */ public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //獲取表單信息 String userName = req.getParameter("userName"); String sex = req.getParameter("sex"); String address = req.getParameter("address"); String[] likes = req.getParameterValues("likes"); String URL = "index.jsp"; String likes2 = ""; if (null != likes) { for (String str : likes) { likes2 += str + " "; } } if (null != userName && !userName.equals("")) { //把從頁面獲取的內容放入到request中 req.setAttribute("userName", userName); req.setAttribute("sex", sex); req.setAttribute("address", address); req.setAttribute("likes", likes2); URL = "result.jsp"; } req.getRequestDispatcher(URL).forward(req, resp); } @Override public void destroy() { super.destroy(); } @Override public void init() throws ServletException { super.init(); } }
3)在web.xml文件中注冊Servlet信息
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>testservlet</servlet-name> <servlet-class>com.yyq.servlet.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>testservlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4)編寫結果頁面result.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>結果頁面</title> </head> <body> <form id = "form" name="form" method="post" action=""> <p align = "center"><strong>表單 提交</strong></p> <table width = "331" height = "147" border="1" align = "center" cellpadding = "0" cellspacing = "0"> <tr> <td width = "76" height = "35">username:</td> <td width = "183"> <label><%=request.getAttribute("userName")%></label> </td> <td width = "50"> </td> </tr> <tr> <td> Sex:</td> <td><%=request.getAttribute("sex")%></td> <td> </td> </tr> <tr> <td> Address:</td> <td><%=request.getAttribute("address")%></td> <td> </td> </tr> <tr> <td> likes:</td> <td> <label><%=request.getAttribute("likes")%></label> </td> <td> </td> </tr> <tr> <td> </td> <td> <a href="index.jsp">Back index.jsp<br/></a> </td> <td> </td> </tr> </table> </form> </body> </html>
5)啟動Tomcat,輸入http://localhost:8080/index.jsp

輸入相關內容,點擊提交即可:

優化:當用戶在username中輸入中文字符時,則有可能出現亂碼。
1)硬編碼方式
首先在index.jsp頁面修改字符集設置:
<%@ page contentType="text/html; charset=GB2312"%>
其次更改Servlet相關代碼。
//JSP引擎會自動把輸出的頁面轉換成指定的字符集 resp.setContentType("text/html;charset=GB2312"); //在JSP中,可以使用req.getParameter("參數名")獲得參數值, //參數值的默認字符集是ISO8859_1,如果不進行字符集轉換,將導致漢字亂碼 String szUserName = req.getParameter("userName"); szUserName = new String(szUserName.getBytes("ISO8859_1"),"GB2312");
2)采用過濾器方式,參考:
http://www.cnblogs.com/yangyquin/p/5427154.html
編寫過濾器類:
package com.yyq.servlet; import javax.servlet.*; import java.io.IOException; /** * Created by gao on 16-4-25. */ public class FormFilter implements Filter { private FilterConfig filterConfig; //Filter初始化時的回調方法 //FilterConfig接口實例中封裝了這個Filter的初始化參數 @Override public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } //主要負責過濾工作 //FilterChain用於調用過濾器鏈中的下一個顧慮器 @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //獲取此Filter的初始化參數的值 String encoding = filterConfig.getInitParameter("encoding"); System.out.println(encoding); if (null != encoding && !"".equals(encoding)){ //設置請求數據的編碼方式 servletRequest.setCharacterEncoding(encoding); } //把請求和響應對象傳給過濾器鏈中的下一個要調用的過濾器或Servlet filterChain.doFilter(servletRequest,servletResponse); } //此Filter被釋放時的回調方法 @Override public void destroy() { //空 } }
修改配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>testservlet</servlet-name> <servlet-class>com.yyq.servlet.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>testservlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> <filter> <filter-name>FormFilter</filter-name> <filter-class>com.yyq.servlet.FormFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>FormFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
輸出漢字: