java web----servlet
1、第一個servlet應用(可以直接創建maven項目,產生maven目錄結構)
導入jar包
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version> </dependency>創建一個類
注意: 創建的包名:不能以java開頭, package com.zy.servlet; package? java.com.zy.servlet(會報錯的)
package com.zy.servlet;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class ServletDemo extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);}@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("<h1>haha</h1>");} }補充
如果重寫的是service方法,那么所有的請求都當成get請求來執行下面的代碼,如果需要判斷get、post方法,通過req.getMethod()?
public class ServletDemo extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {resp.getWriter().write("<h1>hahaha</h1>");} }配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--配置servlet--><servlet><!--配置servlet類路徑,servlet-name任意,servlet-class是一開始創建的servlet類的路徑--><servlet-name>ServletDemo</servlet-name><servlet-class>com.zy.servlet.ServletDemo</servlet-class></servlet><!--servlet-name必須和上面的名字一樣,url-pattern配置訪問的路由 localhost:8080/my--><servlet-mapping><servlet-name>ServletDemo</servlet-name><url-pattern>/my</url-pattern></servlet-mapping> </web-app>啟動,瀏覽器訪問:localhost:8080/my?
補充:(web3.0)可以使用注解的方式,這樣就不許用配置web.xml的請求路徑了
@WebServlet("/haha") //注意格式:/url ,url前必須要有"/" public class ServletDemo implements Servlet {} //注意這個Servlet是一個接口,HttpServlet也是繼承這個接口的?
如果是項目部署的時候:在tomcat的webapps目錄中創建一個project目錄(或者直接使用ROOT目錄)
將下面的文件方進去
進入tomcat的bin目錄,雙擊startup.bat
瀏覽器訪問 localhost:8080/project/my? 也可以
?
總結:如果單純是使用servlet,每一個請求都需要在xml中單獨配置,非常的不方便;
?
仿照HttpServlet寫的接口
直接繼承Servlet
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.ResourceBundle;public class ServletDemo implements Servlet {private static final ResourceBundle lStrings = ResourceBundle.getBundle("javax.servlet.http.LocalStrings");@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("servlet begin");}@Overridepublic ServletConfig getServletConfig() {return null;}public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {HttpServletRequest request;HttpServletResponse response;try {request = (HttpServletRequest)req;response = (HttpServletResponse)res;} catch (ClassCastException var6) {throw new ServletException(lStrings.getString("http.non_http"));}System.out.println(request.getMethod());response.getWriter().write(request.getMethod());}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("servlet end");} }
2、在來理解servlet概念
狹義的Servlet 是指Java 語言實現的一個接口,廣義的Servlet是指任何實現了這個Servlet接口的(servlet通俗理解就是所有實現了servlet接口的實現類,程序員自己寫了類繼承了HTTPServlet,而HttpServlet繼承了這個servlet接口,實現了這個接口,所有支持servlet標準的容器(服務器),就可以認識和處理我們寫了servlet類了),一般情況下,人們將Servlet理解為后者。
Servlet運行于支持Java的應用服務器中。從原理上講,Servlet可以響應任何類型的請求,但絕大多數情況下Servlet 只用來擴展基于HTTP協議的Web服
特點:
Servlet的運行必須要支持Servlet標準的Web容器,像Tomcat、Jboss、Weblogic、WebSphere、Jetty等都支持。
Servlet的實現遵循了服務器能夠識別的規則,也就是服務器會自動的根據請求調用對應的servlet進行請求處理。
簡單方便,可移植性強
運行流程:
瀏覽器發送請求到服務器,服務器根據請求URL地址中的URI信息在webapps目錄下找到對應的項目文件夾,然后在web.xml中檢索對應的servlet類(找到繼承了servlet接口的類),通過反射實例化這個類。調用service方法,通過service方法來調用doget、dopost方法(注意,這個其他的方法,都是通過service方法來調用的,因為tomcat默認只會調用service方法)
3、Servlet生命周期?
1、生命周期(默認)
當第一次servlet(類)被實例化加載到內存之后(默認第一次請求到來,才加載到內存),一直到服務器關閉‘
2、生命周期(配置)
在web.xml中設置了load-on-startup
<servlet><servlet-name>ServletDemo</servlet-name><servlet-class>com.zy.servlet.ServletDemo</servlet-class><load-on-startup>1</load-on-startup> //設置隨服務器啟動,就將servlet加載到內存,數字越小,越優先加載到內存中</servlet><servlet-mapping><servlet-name>ServletDemo</servlet-name><url-pattern>/my</url-pattern></servlet-mapping>生命周期:當服務器啟動一直到服務器關閉
?
4、Servlet使用
Request對象
//獲取請求頭數據 //獲取請求方式String method=req.getMethod(); //獲取請求URL StringBuffer url=req.getRequestURL();String uri=req.getRequestURI(); //獲取協議String h=req.getscheme(); //獲取請求行數據//獲取指定的請求行信息String value=req.getHeader("User-Agent"); //獲取所有的請求行的鍵的枚舉Enumeration e=req.getHeaderNames();while(e. hasMoreElements()){string name=(String)e. nextElement()); //獲取參數String name=req. getParameter("uname), //注意getparameter 不能獲取同鍵不同值的多個數據(像復選框之類的);String[] likes=req. getParameterValues("like"); //可以獲取多個值了請求的數據如果出現亂碼
請求中文亂碼解決: 方式1、使用String進行數據重新編碼uname=new String(uname.getBytes("iso8859-1"),"utf-8"); 方式2、使用公共配置get方式:步驟一:req.setcharacterEncoding("utf-8");步驟二:在tomcat的目錄下的conf目錄中修改server.xml文件:在Connector標簽中增加屬性<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/> //多加了一個useBodyEncodingForURI="true";或者參考:https://www.jb51.net/article/145741.htmpost方式:req.setCharacterEncoding("utf-8");請求轉發學習
注意:無論項目是否有根路徑(不是ROOT目錄),轉發的地址都是"/"
請求轉發學習:作用:實現多個servlet聯動操作處理請求,這樣避免代碼冗余,讓servlet的職責更加明確。使用:req.getRequestDispatcher(“要轉發的地址").forward(req,resp);地址:相對路徑,直接書寫servlet的別名即可。特點:一次請求,瀏覽器地址欄信息不改變。注意:請求轉發后直接return結束即可。網址欄上url不變
servlet流轉過程中的數據封裝
req.setAttribute("xx","xxxxx");//往req中添加數據,注意設置的是一個對象, (String)req.getAttrubute("xx");//獲取數據;注意由于之前的封裝的是String對象,此時就可以強轉為String對象請求重定向
注意:如果項目有根路徑(不是ROOT目錄),轉發的地址都是"/項目更目錄/"
使用:resp.sendRedirect("/1ogin/main"); 特點兩次請求,兩個request對象。瀏覽器地址欄信息改變 時機:如果請求中有表單數據,而數據又比較重要,不能重復提交,建議使用重定向。如果請求被Servlet接收后,無法進行處理,建議使用重定向定位到可以處理的資源。Cookie使用
Cookie學習:作用:解決了發送的不同請求的數據共享間題 使用://創建Cookie對象Cookie c=new Cookie(string name,String value);//設置cookie(可選)//設置有效期(默認存放在內存中,隨著瀏覽器關閉而關閉)c.setMaxAge(int seconds);//設置有效路徑(只有訪問該路徑,cookie才會附帶上)c.setPath(string uri)//響應Cookie信息給客戶端resp.addCookie(c); 注意:一個Cookie對象存儲一條數據。多條數據,可以多創建幾個Cookie對象進行存儲。 特點:瀏覽器端的數據存儲技術。存儲的數據聲明在服務器端。臨時存儲:存儲在瀏覽器的運行內存中,瀏覽器關閉即失效。定時存儲:設置了Cookie的有效期,存儲在客戶端的硬盤中,在有效期內符合路徑要求的請求都會附帶該信息。默認cookie信息存儲好之后,每次請求都會附帶,除非設置有效路徑cookie獲取
//獲取Cookie信息數組Cookie[]cks=req.getcookies(); //遍歷數組獲取Cookie信息使用for循環遍歷即可,示例:if(cks!=nul1){For(Cookie c:cks){String name=c.getName();String value=c.getValue(); system.out.print1n(name+":"+value);}}Session使用
sessionid生命周期
1、瀏覽器第一次請求服務器時,服務器會生成一個sessionId,并返回給瀏覽器,這個sessionId會被保存在瀏覽器的會話cookie中。
2、在瀏覽器不關閉的情況下,之后的每次請求請求頭都會攜帶這個sessionId到服務器(一般會設置更新服務器session時間)
3、如果瀏覽器一直到30分鐘后,才發起第二次請求,此時的服務器session已經清空,服務器就會生成一個新的sessionId給瀏覽器(伴隨著一個新的session存在服務器),替代之前的瀏覽器的sessionid
4、第三次請求,就帶上的新的sessionid。
默認情況,session在服務器上儲存為30分鐘,保存了用戶的一些信息,一旦session清除,用戶這次登陸的所有的數據都全部清除。那我們是不是又要手動重新登陸了?我們是需要重新登陸的,只是cookie幫我們自動登錄了,一般服務器會給我們瀏覽器上保存一個cookie,用來驗證身份登陸的。每次都會默默的幫我們登陸,其實每次我們打開瀏覽器,打開某一個網址,這時候,cookie就會幫我們默默等登陸,只是我們感受不到而已。
所以,我們一般驗證用戶信息的時候(攔截器),一般先看session中是否保存了user對象,如果沒有,獲取cookie中的賬號和密碼看看是否可以登錄,如果還是不行,直接跳轉到登錄頁面;
?
使用:創建session對象/獲取session對象HttpSession hs=req.getSession();如果請求中擁有session的標識符也就是JSESSIONID,則返回其對應的session對象,如果請求中沒有session的標識符也就是JSESSIONID,則創建新的session對象,并將其JSESSIONID作為從cookie數據存放到瀏覽器上。如果session對象是失效了,也會重新創建一個session對象,并將其JSESSIONID存儲在瀏覽器內存中。?
設置session存儲時間(單位:秒),默認30分鐘,每一個請求都會重新設置失效時間hs.setMaxInactiveInterval(5); 獲取sessionidhs.getId(): 設置session強制失效hs.invalidate();l 存儲數據hs.setAttribute("name",name); 獲取數據hs.getAttribute("name") 使用時機: 一般用戶在登陸web項目時會將用戶的個人信息存儲到Sesion中,供該用戶的其他請求使用。直接配置session過期時間
1、在tomcat中的web.xml(conf目錄下)修改這個時間
<session-config><session-timeout>30</session-timeout> </session-config>2、在項目中添加上面的代碼;并設置失效的時間
ServletContext對象
需求:不同的用戶需要使用同一個對象
特點:服務器創建,用戶共享
生命周期:服務器啟動到服務器關閉
作用域:整個項目內
使用1
獲取方式: //第一種方式(常用)ServletContext sc=this.getservletContext(); //第二種方式ServletContext sc2=this.getServletConfig().getServletContext(); //第三種方式(常用)ServletContext sc3=req.getSession().getServletContext(); //數據存儲sc.setAttribute(String name,Object value); //數據獲取sc.getAttribute("str")返回的是0bject類型使用2
獲取項目中web.xm1文件中的全局配置數據
作用:使靜態數據和代碼進行解耦
1、在web.xml 配置全局數據
<!--配置全局數據--><context-param> //注意一個context-param只能配置一個鍵值對<param-name>name</param-name><param-value>zhangsan</param-value> </context-param>2、獲取
獲取項目中web.xm1文件中的全局配置數據sc.getInitParameter(String name);根據鍵的名字返回web.xml中配置的全局數據的值,返回String類型。如果數據不存在返回nul1。sc.getInitParameterNames();返回鍵名的枚舉獲取資源的絕對路徑和資源的流對象
獲取項目webroot下的資源的絕對路徑。String path=sc.getRealPath(String path);獲取的路徑為項目根目錄, path參數為項目根目錄中的路徑 獲取webroot下的資源的流對象InputStream is=sc.getResourceAsStream(String path);注意:此種方式只能獲取項目根目錄下的資源流對象,c1ass文件的流對象需要使用類加載器獲取。path參數為項目根目錄中的路徑webroot:在tomcat服務器上,就相當于webapps的絕對路徑ServletConfig對象
作用:專門給servlet自己做配置的對象,別的servlet獲取不到該數據。操作:在web.xml配置 <servlet><servlet-name>ServletDemo</servlet-name><servlet-class>com.zy.servlet.ServletDemo</servlet-class><init-param> //注意只能在自己的servlet中配置數據<param-name>name</param-name><param-value>zhangsan</param-value></init-param> </servlet>
獲取
//獲取ServletConfig對象ServletConfig sc=this.getServletConfig(); //獲取web.xm1中的配置數據String name=sc.getInitParameter("name"); System.out.print1n(name);
Response對象
//設置響應頭resp.setHeader(String name,String value);//在響應頭中添加多個響應信息,但是同鍵會覆蓋resp.addHeader(String name,String value);//在響應頭中添加多個響應信息,但是不會覆蓋。 //設置響應狀態碼resp. sendError(405,"this Method is not supported"); //設置響應實體(在頁面上展示的)resp.getWriter().write("this is resp study"); //設置響應編碼格式,解決亂碼resp.setHeader("content-type","text/html;charset=utf-8");resp.setContentType("text/html;charset=utf-8");//簡寫,text/html,會將<b></b>等html標簽解析resp.setContentType("text/plain;charset=utf-8"); //會把<b></b>等標簽當做普通的文本顯示在瀏覽器上resp.setContentType("text/xml;charset=utf-8"); //會把響應的數據以xml的格式顯示在瀏覽器上
web.xml解析
區別:
Web項目下的web.xml文件為局部配置,針對本項目的位置。
Tomcat下的web.xml文件為全局配置,配置公共信息。
內容(核心組件):
全局上下文配置(全局配置參數)
Servlet配置
過濾器配置
監聽器配置
? ? 加載順序:
? Web容器會按ServletContext->context-param->listener->filter->servlet這個順序加載組件,這些元素可配置在web.xml文件中的任意位置。
加載時機:
服務器啟動時。
server.xml解析
核心組件
<Server><Service> //一個server下可以配置多個service,可以在配置端口,就可以通過不同的端口訪問<Connector/> //配置端口,可以配置多個<Connector/><Engine> //引擎,只能配置一個<Host> //配置項目的存放位置的根目錄<Context/></Host></Engine></Service> </Server>熱部署
在Host中配置,如果將項目刪除了,記得tomcat的server.xml要將這段代碼刪除掉,否則會報錯,但是tomcat其他的項目還是正常的啟動。
<Context path ="/Pet" reloadable ="true" docBase="F:/PetWeb"/>解釋:/Pet? :虛擬路徑,請求的時候需要帶上
? /F:/PetWeb :熱部署的項目;
?
?
servlet過濾器
參考:https://www.runoob.com/jsp/jsp-writing-filters.html
? ? ? ? ? ?https://my.oschina.net/u/1171518/blog/265467
Servlet監聽器(對作用域數據的監聽)
創建幾個java類實現監聽接口
package com.zy.listener;import javax.servlet.*; import javax.servlet.http.*;public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener , HttpSessionListener , HttpSessionAttributeListener,ServletContextListener,ServletContextAttributeListener{//對request對象@Overridepublic void requestDestroyed(ServletRequestEvent sre) {//如果某些數據有用,在銷毀的前,將他存放到ServletContext中Object xx = sre.getServletRequest().getAttribute("xx");sre.getServletContext().setAttribute("xx",xx);System.out.println("request對象被銷毀");}@Overridepublic void requestInitialized(ServletRequestEvent sre) {System.out.println("request對象初始化");}//對request屬性監聽@Overridepublic void attributeAdded(ServletRequestAttributeEvent srae) {String name = srae.getName();Object value = srae.getValue();}@Overridepublic void attributeRemoved(ServletRequestAttributeEvent srae) {}@Overridepublic void attributeReplaced(ServletRequestAttributeEvent srae) {}//對session對象監聽@Overridepublic void sessionCreated(HttpSessionEvent se) {}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {}//對session屬性的監聽@Overridepublic void attributeAdded(HttpSessionBindingEvent se) {}@Overridepublic void attributeRemoved(HttpSessionBindingEvent se) {}@Overridepublic void attributeReplaced(HttpSessionBindingEvent se) {}//對servletcontext對象監聽@Overridepublic void contextInitialized(ServletContextEvent sce) {}@Overridepublic void contextDestroyed(ServletContextEvent sce) {}//對servletcontext屬性的監聽@Overridepublic void attributeAdded(ServletContextAttributeEvent scae) {}@Overridepublic void attributeRemoved(ServletContextAttributeEvent scae) {}@Overridepublic void attributeReplaced(ServletContextAttributeEvent scae) {} }web.xml配置
<listener><listener-class>com.zy.listener.RequestListener</listener-class> </listener>
Tomcat啟動的時候,需求:加載配置文件
1、方式1:使用servlet--->init方法---><load-on-startup>
2、方式2:使用filter--->init方法--->web.xml注冊過濾器之后自動調用初始化
3、方式3:使用監聽器,ContextLoaderLister(spring推薦使用)
使用方式3:
需要額外導入jar包,spring-web
參考我的另一篇博客:https://i.cnblogs.com/EditPosts.aspx?postid=10827203&update=1
?
cookie免登陸和session綜合使用
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException;@WebServlet("/login") public class LoginServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Cookie[] cookies = req.getCookies();for (Cookie cookie:cookies){if ("username".equals(cookie.getName())){String value = cookie.getValue();//判斷用戶是否存在(查數據庫,驗證用戶是否存在)if ("admin".equals(value)){//設置session,存放會話HttpSession session = req.getSession();session.setAttribute("username",value);resp.sendRedirect("/home");return;}}}resp.sendRedirect("/login.jsp");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");String pwd = req.getParameter("pwd");//查詢數據庫,如果有用戶,就設置sessionif (true){//設置cookie,免登陸Cookie cookie = new Cookie("username",username);cookie.setMaxAge(60*5);cookie.setPath("/");resp.addCookie(cookie);//設置session,存放會話HttpSession session = req.getSession();session.setAttribute("username",username);session.setAttribute("pwd",pwd);resp.sendRedirect("/home");}} }@WebServlet("/home") public class ServletDemo extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {HttpSession session = req.getSession();Object username = session.getAttribute("username");if(username==null){resp.sendRedirect("/login");return;}resp.setHeader("content-type","text/html;charset=utf-8");resp.getWriter().write((String)username+"登錄成功");} }
?
轉載于:https://www.cnblogs.com/yanxiaoge/p/11081679.html
總結
以上是生活随笔為你收集整理的java web----servlet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于lombok插件的使用,强大的简化代
- 下一篇: 看了5种分布式事务方案,最终选择了Sea