Java Web学习总结(3)Servlet(二)
一,Servlet訪問URL映射配置
由于客戶端是通過URL地址訪問web服務(wù)器中的資源,所以Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工作在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
Servlet:該元素用于注冊Servlet,它包含有兩個主要的子元素:<servlet-name>和<servlet-class>,分別用于設(shè)置Servlet的注冊名稱和Servlet的完整類名。
servlet-mapping:該元素用于映射一個已注冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:<servlet-name>和<url-pattern>,分別用于指定Servlet的注冊名稱和Servlet的對外訪問路徑。
<servlet><servlet-name>HelloServlet</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet關(guān)聯(lián)的類 --> </servlet> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello.html</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping>同一個Servlet可以被映射到多個URL上,即多個<servlet-mapping>元素的<servlet-name>子元素的設(shè)置值可以是同一個Servlet的注冊名
<servlet><servlet-name>HelloServlet</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet關(guān)聯(lián)的類 --> </servlet> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello.html</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello1.html</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello2.html</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping>二,ServletURL通配符:*
在Servlet映射到的URL中也可以使用*通配符,但是只能有兩種固定的格式:
格式一:*.擴展名"
<servlet><servlet-name>HelloServlet</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet關(guān)聯(lián)的類 --> </servlet> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>*.html</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping>格式二:以正斜杠(/)開頭并以"/*"結(jié)尾
<servlet><servlet-name>HelloServlet</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet關(guān)聯(lián)的類 --> </servlet> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello/*</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping>三,缺省Servlet
Servlet的映射路徑僅僅為一個正斜杠(/),那么這個Servlet就成為當(dāng)前Web應(yīng)用程序的缺省Servlet。 凡是在web.xml文件中找不到匹配的<servlet-mapping>元素的URL,它們的訪問請求都將交給缺省Servlet處理。
<servlet><servlet-name>HelloServlet</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet關(guān)聯(lián)的類 --> </servlet> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping>四,ServletConfig
ServletConfig代表當(dāng)前Servlet在web.xml中的配置信息。
1,Servlet初始化參數(shù)
在Servlet的配置文件中,可以使用一個或多個<init-param>標(biāo)簽為servlet配置一些初始化參數(shù)。
例如:
<servlet><servlet-name>HelloServlet</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet關(guān)聯(lián)的類 --><init-param><param-name>name</param-name><param-value>Zender</param-value></init-param><init-param><param-name>encode</param-name><param-value>UTF-8</param-value></init-param> </servlet> <servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello.html</url-pattern><!-- servlet訪問路徑 --> </servlet-mapping>2,通過ServletConfig獲取Servlet的初始化參數(shù)
當(dāng)servlet配置了初始化參數(shù)后,web容器在創(chuàng)建servlet實例對象時,會自動將這些初始化參數(shù)封裝到ServletConfig對象中,并在調(diào)用servlet的init方法時,將ServletConfig對象傳遞給servlet。進而,通過ServletConfig對象就可以得到當(dāng)前servlet的初始化參數(shù)信息。
public class HelloServlet extends HttpServlet{private static final long serialVersionUID = 3903946972744326948L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取ServletConfigServletConfig config = this.getServletConfig();//獲取初始化參數(shù)String name = config.getInitParameter("name");String encode = config.getInitParameter("encode");//設(shè)置編碼格式,否則中文會出現(xiàn)亂碼resp.setCharacterEncoding("GBK");PrintWriter out = resp.getWriter();out.println("name:" + name);out.println("encode:" + encode);} }五,ServletContext
WEB容器在啟動時,它會為每個WEB應(yīng)用程序都創(chuàng)建一個對應(yīng)的ServletContext對象,它代表當(dāng)前web應(yīng)用。
ServletConfig對象中維護了ServletContext對象的引用,開發(fā)人員在編寫servlet時,可以通過ServletConfig.getServletContext()方法獲得ServletContext對象。
由于一個WEB應(yīng)用中的所有Servlet共享同一個ServletContext對象,因此Servlet對象之間可以通過ServletContext對象來實現(xiàn)通訊。ServletContext對象通常也被稱之為context域?qū)ο蟆?
1,獲取WEB應(yīng)用的初始化參數(shù)
在web.xml文件中使用<context-param>標(biāo)簽配置WEB應(yīng)用的初始化參數(shù):
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>ServletDemo</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><!-- 配置WEB應(yīng)用的初始化參數(shù) --><context-param><param-name>name</param-name><param-value>Zender</param-value></context-param><context-param><param-name>encode</param-name><param-value>UTF-8</param-value></context-param><servlet><servlet-name>HelloServlet</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.HelloServlet</servlet-class><!-- servlet關(guān)聯(lián)的類 --></servlet><servlet-mapping><servlet-name>HelloServlet</servlet-name><url-pattern>/hello.html</url-pattern><!-- servlet訪問路徑 --></servlet-mapping> </web-app>獲取Web應(yīng)用的初始化參數(shù):
public class HelloServlet extends HttpServlet{private static final long serialVersionUID = 3903946972744326948L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取ServletContextServletContext context = this.getServletContext();//獲取初始化參數(shù)String name = context.getInitParameter("name");String encode = context.getInitParameter("encode");//設(shè)置編碼格式,否則中文會出現(xiàn)亂碼resp.setCharacterEncoding("GBK");PrintWriter out = resp.getWriter();out.println("name:" + name);out.println("encode:" + encode);} }2,多個Servlet通過ServletContext對象實現(xiàn)數(shù)據(jù)共享
例如 :ServletTwo獲得ServletOne所共享的數(shù)據(jù)
ServletOne:
public class ServletOne extends HttpServlet{private static final long serialVersionUID = 3903946972744326948L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//共享的數(shù)據(jù)String name = "zender";//獲取ServletContextServletContext context = this.getServletContext();//將name存儲到ServletContext對象中context.setAttribute("name", name);} }ServletTwo:
public class ServletTwo extends HttpServlet{private static final long serialVersionUID = 3903946972744326948L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取ServletContextServletContext context = this.getServletContext();//獲取初始化參數(shù)String name = (String) context.getAttribute("name");PrintWriter out = resp.getWriter();out.println("name:" + name);} }Web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>ServletDemo</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>ServletOne</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.ServletOne</servlet-class><!-- servlet關(guān)聯(lián)的類 --></servlet><servlet-mapping><servlet-name>ServletOne</servlet-name><url-pattern>/ServletOne.html</url-pattern><!-- servlet訪問路徑 --></servlet-mapping><servlet><servlet-name>ServletTwo</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.ServletTwo</servlet-class><!-- servlet關(guān)聯(lián)的類 --></servlet><servlet-mapping><servlet-name>ServletTwo</servlet-name><url-pattern>/ServletTwo.html</url-pattern><!-- servlet訪問路徑 --></servlet-mapping> </web-app>先訪問:http://localhost:8081/ServletDemo/ServletOne.html
再訪問:http://localhost:8081/ServletDemo/ServletTwo.html
3,用servletContext實現(xiàn)請求轉(zhuǎn)發(fā)
context.getRequestDispatcher()方法實現(xiàn)請求轉(zhuǎn)發(fā)
ServletOne:
public class ServletOne extends HttpServlet{private static final long serialVersionUID = 3903946972744326948L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//共享的數(shù)據(jù)String name = "zender";//獲取ServletContextServletContext context = this.getServletContext();//將name存儲到ServletContext對象中context.setAttribute("name", name);context.getRequestDispatcher("/ServletTwo.html").forward(req, resp);} }ServletTwo:
public class ServletTwo extends HttpServlet{private static final long serialVersionUID = 3903946972744326948L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//獲取ServletContextServletContext context = this.getServletContext();//獲取初始化參數(shù)String name = (String) context.getAttribute("name");PrintWriter out = resp.getWriter();out.println("name:" + name);} }Web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>ServletDemo</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>ServletOne</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.ServletOne</servlet-class><!-- servlet關(guān)聯(lián)的類 --></servlet><servlet-mapping><servlet-name>ServletOne</servlet-name><url-pattern>/ServletOne.html</url-pattern><!-- servlet訪問路徑 --></servlet-mapping><servlet><servlet-name>ServletTwo</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.ServletTwo</servlet-class><!-- servlet關(guān)聯(lián)的類 --></servlet><servlet-mapping><servlet-name>ServletTwo</servlet-name><url-pattern>/ServletTwo.html</url-pattern><!-- servlet訪問路徑 --></servlet-mapping> </web-app>訪問:http://localhost:8081/ServletDemo/ServletOne.html
訪問的是ServletOne.html,瀏覽器顯示的卻是ServletTwo.html的內(nèi)容,這就是使用ServletContext實現(xiàn)了請求轉(zhuǎn)發(fā)。
4,利用ServletContext對象讀取資源文件
獲取上圖的config.properties資源文件內(nèi)容:
GetProperties.Java:
public class GetProperties extends HttpServlet{private static final long serialVersionUID = 3903946972744326948L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//設(shè)置瀏覽器編碼格式為UTF-8resp.setHeader("content-type","text/html;charset=UTF-8");resp.getWriter().println("讀取src目錄下的config.properties配置文件:");//讀取src目錄下的properties配置文件readProperties(resp,"/WEB-INF/classes/config.properties");resp.getWriter().println("<hr/>讀取WebRoot目錄下的config.properties配置文件:");//讀取WebRoot目錄下的properties配置文件readProperties(resp,"config.properties");}/*** * @方法名: readProperties* @描述: 獲取properties配置文件內(nèi)容* @param resp* @param fileUrl* @throws IOException * @創(chuàng)建人 zender*/protected void readProperties(HttpServletResponse resp, String fileUrl) throws IOException{//2種方式都能獲取到config.properties//InputStream in = new FileInputStream(this.getServletContext().getRealPath(fileUrl));InputStream in = this.getServletContext().getResourceAsStream(fileUrl);Properties prop = new Properties();prop.load(in);String url = prop.getProperty("database.url");String username = prop.getProperty("database.username");String password = prop.getProperty("database.password");resp.getWriter().println(MessageFormat.format("url={0},username={1},password={2}", url,username, password));} }Web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID" version="3.0"><display-name>ServletDemo</display-name><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list><servlet><servlet-name>GetProperties</servlet-name><!-- servlet名稱 --><servlet-class>com.zender.servlet.GetProperties</servlet-class><!-- servlet關(guān)聯(lián)的類 --></servlet><servlet-mapping><servlet-name>GetProperties</servlet-name><url-pattern>/GetProperties.html</url-pattern><!-- servlet訪問路徑 --></servlet-mapping> </web-app>訪問路徑:http://localhost:8081/ServletDemo/GetProperties.html
轉(zhuǎn)載于:https://www.cnblogs.com/Zender/p/7598785.html
總結(jié)
以上是生活随笔為你收集整理的Java Web学习总结(3)Servlet(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RUP和XP基础
- 下一篇: 我的第一个python web开发框架(