柚子快報邀請碼778899分享:Servlet見解2
柚子快報邀請碼778899分享:Servlet見解2
4 創(chuàng)建servlet的三種方式
4.1 實現(xiàn)Servlet接口的方式
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/test1")
public class Servlet1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//s使用ServletConfig對象初始化我們的Servlet
//執(zhí)行了,從這個地方可以說明一個問題 Servlet已經(jīng)被實例化了
System.out.println("init方法執(zhí)行");
}
@Override
public ServletConfig getServletConfig() {
//獲取servlet配置信息對象
//沒有執(zhí)行
System.out.println("getServletConfig方法執(zhí)行");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//核心方法 類似于我們的doGet()方法,和doPost()方法 請求和響應(yīng)
//一定執(zhí)行的
System.out.println("service");
}
@Override
public String getServletInfo() {
//獲取Servlet的詳細信息
//沒有執(zhí)行
System.out.println("getServletInfo方法執(zhí)行");
return null;
}
@Override
public void destroy() {
//當(dāng)tomcat關(guān)閉的時候,執(zhí)行銷毀這個servlet的方法
System.out.println("destroy方法執(zhí)行");
//只有當(dāng)tomcat關(guān)閉的時候,才會執(zhí)行這個方法
}
}
4.2 繼承GenericServlet抽象類的方式
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/*
* 第二種方式:繼承GenericServlet
*
* */
@WebServlet("/test2")
public class Servlet2 extends GenericServlet {
//只有一個方法是必須重寫的,抽象方法
//為什么?service是核心方法,因為請求和響應(yīng)就是執(zhí)行這個方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//解決中文亂碼問題
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("我是第二種創(chuàng)建Servlet的方法");
}
}
4.3 繼承HttpServlet的方式
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test3")
public class Servlet3 extends HttpServlet {
//因為在前端的時候,有兩種請求方式get和post
//doGet和doPost方法寫在了Service方法中了
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("我是HttpServlet創(chuàng)建的Servlet");
}
}
這三個創(chuàng)建方式選擇哪個?
最好的方式是繼承HttpServlet
1.可以減少對其他方法的要求 init destroy
2.可以根據(jù)前端的要求進行分門別類 doGet doPost
5 Servlet獲取前端提交的參數(shù)
學(xué)好Servlet必須緊緊圍繞著請求和響應(yīng)這兩個概念 以上寫的代碼只是進行請求,然后再響應(yīng)到客戶端。請求的時候沒有帶數(shù)據(jù)給Servlet 下面開始寫在請求的時候前端帶數(shù)據(jù)到servlet里面,我們servlet要接收前端給我們的這個數(shù)據(jù)
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
servlet實例
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//html頁面中 input標簽發(fā)送的數(shù)據(jù),都會存到HttpServlet這個對象里面
//通過前端input標簽name的屬性值獲取前端發(fā)送的數(shù)據(jù)
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("username: " + username+"===password"+password);
//Servlet響應(yīng)數(shù)據(jù)到客戶端的時候,如果是中文的話,會亂碼
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("username: " + user+"===password"+password);
}
}
web.xml
6 中文亂碼的解決方案
請求時候的亂碼問題:
//前端發(fā)送數(shù)據(jù)到Servlet,如果是post請求的話,input輸入中文數(shù)據(jù)的時候,Servlet接到的數(shù)據(jù)是亂碼的。
request.setCharacterEncoding("utf-8");
響應(yīng)時候中文亂碼的問題:
//Servlet響應(yīng)數(shù)據(jù)到客戶端的時候,如果是中文的話,會亂碼
response.setContentType("text/html;charset=utf-8");
7 重定向和轉(zhuǎn)發(fā)
web網(wǎng)站上面有一些跳轉(zhuǎn)按鈕。比如登錄成功以后跳轉(zhuǎn)到主頁面?。?!
7.1 重定向
是什么
用戶通過瀏覽器發(fā)送一個請求,Tomcat服務(wù)器接收這個請求,會給瀏覽器發(fā)送一個狀態(tài)碼302,并設(shè)置一個重定向的路徑,瀏覽器如果接收到了這個302的狀態(tài)碼以后,就會去自動加載服務(wù)器設(shè)置的路徑
一個頁面跳轉(zhuǎn)到另外一個頁面(應(yīng)用場景)、登錄頁面跳轉(zhuǎn)到主頁面: login.jsp====>LoginServlet====>main.jsp
特征:
①重定向的過程是瀏覽器(客戶端)的行為 ②實際上瀏覽器做了2次請求(當(dāng)點擊登錄按鈕的時候做了兩次請求)(分別是請求login和main.jsp) ③注意上一次請求的request對象會丟失 ④重定向有一個非常明顯的特征,即瀏覽器的url變化了
重定向就一句核心代碼:
response.sendRedirect("main.jsp"); //就這一行代碼,但是這一行代碼必須寫在doGet或者doPost方法中
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--請求RedirectServlet--%>
RedirectServlet
package com.by.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 RedirectServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設(shè)置字符編碼
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setAttribute("username", username);
request.setAttribute("password", password);
//登錄以后跳轉(zhuǎn)到主頁
//重定向
//這個TestLoginServlet里面的數(shù)據(jù)是不能傳給target.html的
response.sendRedirect("main.jsp");
}
}
web.xml
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
這是main頁面
<%--
<%=request.getAttribute("username")%>
<%=request.getAttribute("password")%>
--%>
${username}
${password}
測試
7.2 轉(zhuǎn)發(fā)
是什么
用戶發(fā)送數(shù)據(jù)請求到服務(wù)器,服務(wù)器接收當(dāng)前請求,會調(diào)用內(nèi)部方式(轉(zhuǎn)發(fā))處理該請求,最終把響應(yīng)給客戶端
特征:
①轉(zhuǎn)發(fā)是服務(wù)器的行為 ②瀏覽器在這個過程中只有一次行為 ③轉(zhuǎn)發(fā)可以帶有數(shù)據(jù) request對象中 ④url不會發(fā)生任何的變化
核心代碼也只有一行
request.getRequestDispatcher(“main.jsp”).forward(request,response);
//這一行代碼就表示進行了轉(zhuǎn)發(fā),url沒有變,但是響應(yīng)的結(jié)果卻是一次請求干了兩個活
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--請求ForwardServlet--%>
ForwardServlet
package com.by.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 ForwardServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//設(shè)置字符編碼
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setAttribute("username", username);
request.setAttribute("password", password);
//登錄以后跳轉(zhuǎn)到主頁
//重定向
//這個TestLoginServlet里面的數(shù)據(jù)是不能傳給target.html的
request.getRequestDispatcher("main.jsp").forward(request, response);
}
}
web.xml
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
這是main頁面
${username}
${password}
測試
8 Servlet的自動加載
默認情況下,第一次訪問servlet的時候,創(chuàng)建servlet對象。如果servlet構(gòu)造函數(shù)里面的代碼或者init方法里面的代碼比較多,就會導(dǎo)致用戶第一次訪問servlet的時候比較慢。這個時候,我們可以改變servlet對象的創(chuàng)建時機:提前到加載web應(yīng)用的時候。在servlet的配置信息中,加上一個
servlet實例:
public class LoadOnStartupServlet implements HttpServlet {
public LoadOnStartupServlet(){
System.out.println("LoadOnStartupServlet constructor method has run....");
}
}
這樣配置之后,servlet的構(gòu)造函數(shù)和init方法就會在web應(yīng)用加載的時候就會執(zhí)行。
9 ServletConfig對象
是什么 ServletConfig是javax.servlet.包下的一個接口,ServletConfig它是Servlet的一個配置對象; ServletConfig是由tomcat容器創(chuàng)建,通過init方法傳入給Servlet; ServletConfig對象如何獲取? 在GenericServlet里面定義了:
public ServletConfig getServletConfig() {
return this.config;
}
常用方法
getInitParameter(String parameterName); //根據(jù)參數(shù)名稱獲取指定的參數(shù)值
getInitParameterNames(); //獲取所有的參數(shù)名稱
需求:
獲取servlet里面定義的參數(shù)
package com.by.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
public class ServletConfigServlet extends HttpServlet {
@Override
public void service(ServletRequest servletRequest,
ServletResponse servletResponse) throws ServletException {
//1.獲取ServletConfig對象
ServletConfig servletConfig = getServletConfig();
//2.獲取Servlet中的初始化參數(shù)
String username = servletConfig.getInitParameter("username");
System.out.println(username);
String password = servletConfig.getInitParameter("password");
System.out.println(password);
//3.獲取ServletContext對象(域?qū)ο?
ServletContext servletContext = servletConfig.getServletContext();
}
}
思考:param參數(shù)可不可以在另外的Servlet中獲取? 不能
public class ServletConfigServlet2 extends HttpServlet {
@Override
public void goGet(ServletRequest servletRequest,
ServletResponse servletResponse) throws ServletException {
//1.獲取ServletConfig對象
ServletConfig servletConfig = getServletConfig();
//2.獲取Servlet中的初始化參數(shù)
String username = servletConfig.getInitParameter("username");//不能獲取
System.out.println(username);
String password = servletConfig.getInitParameter("password");//不能獲取
System.out.println(password);
//3.獲取ServletContext對象(域?qū)ο?
ServletContext servletContext = servletConfig.getServletContext();
}
}
10 ServletContext對象
是什么 ServletContext是javax.servlet包下的一個接口,又稱上下文對象,是配置對象也是一個域?qū)ο螅?當(dāng)服務(wù)器啟動時,會為服務(wù)器中的每一個web應(yīng)用程序創(chuàng)建一個ServletContext對象; 在web應(yīng)用中的servlet要想實現(xiàn)資源的共享,可以通過ServletContext來完成; 如何獲取這個對象:
public ServletContext getServletContext() {
//獲取ServletContext對象
return this.getServletConfig().getServletContext();
}
這個對象里面也有很多方法:
getInitParameter() //獲取指定參數(shù)名稱的全局參數(shù)值
getRealPath(String path) //獲得當(dāng)前項目的服務(wù)器磁盤路徑
getContextPath() //獲取項目的根路徑
getAttribute(String parameterName) //獲取ServletContext域中指定名稱的參數(shù)值;
setAttribute(String paramterName,Object parameterValue) //存儲參數(shù)到ServletContext域中;
removeAttribute(String parameterNam) //將ServletContext域中指定名稱的參數(shù)移除;
需求
獲取servlet里面定義的參數(shù)
package com.by.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
public class ServletContextServlet extends HttpServlet {
@Override
public void service(ServletRequest servletRequest,
ServletResponse servletResponse) throws ServletException {
//獲取ServletContext對象
ServletContext servletContext = getServletContext();
//1.獲取全局初始化參數(shù)
String username = servletContext.getInitParameter("username");
System.out.println(username);
String password = servletContext.getInitParameter("password");
System.out.println(password);
//2.獲取服務(wù)器真實路徑
String upload = servletContext.getRealPath("");
System.out.println(upload);
//3.獲取項目的根路徑
String contextPath = servletContext.getContextPath();
System.out.println(contextPath);
//4.往ServletContext域中,存儲一個名稱為msg的屬性,值為"hello"
String str = "hello";
servletContext.setAttribute("msg",str);
}
}
思考:param參數(shù)可不可以在另外的Servlet中獲取? 不能
package com.by.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class ServletContextServlet2 extends HttpServlet {
@Override
public void doGet(ServletRequest servletRequest,
ServletResponse servletResponse) throws ServletException {
//從ServletContext域中取出msg的值
ServletContext servletContext = getServletContext();
//1.獲取全局初始化參數(shù)
String username = servletContext.getInitParameter("username");
System.out.println(username);
String password = servletContext.getInitParameter("password");
System.out.println(password);
//2.獲得msg屬性
Object msg = servletContext.getAttribute("msg");//能獲取
System.out.println(msg);
}
}
package com.by.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
public class ServletContextServlet3 extends HttpServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException {
//1.獲取ServletContext對象
ServletContext servletContext = getServletContext();
//將ServletContext域中的msg參數(shù)移除
servletContext.removeAttribute("msg");
}
}
11 Request對象
是什么
ServletRequest是一個接口,用戶訪問服務(wù)器,服務(wù)器會生成一個對象包含了http所有請求頭,由于使用的是http協(xié)議,所以該對象的名字叫HttpServletRequest
常用的方法
getRequestURL() //獲取的完整的URL,即統(tǒng)一資源定位符
getRequestURI() //獲取資源的名字,即統(tǒng)一資源標識符
getQueryString() //獲取一個url參數(shù)部分
getRemoteAddr() //返回的是客戶端的ip地址
getRemoteUser() //返回的是客戶端的用戶
getRemotePort() //返回的是客戶端的主機的端口號
getRemoteHost() //返回的是客戶端的主機地址
getCookie() //獲取Cookie對象
getSession() //獲取Session對象
getLocalName() //獲取Web服務(wù)器主機的名字
getServletContext() //獲取上下文對象的
setCharacterEncoding() //設(shè)置編碼集的
getParameter() //獲取前端傳過來的數(shù)據(jù)
setAttribute() //將數(shù)據(jù)設(shè)置給request對象
geAttribute() //獲取request對象中的數(shù)據(jù)
servlet實例
package com.by.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 RequestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws Exception {
doGet(request, response);
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws Exception{
//獲取一個完整的url
//http://localhost:8080/01_servlet_HelloWorld_war/request1
System.out.println(request.getRequestURL());
//獲取資源的名字
//比如:http://localhost:8080/day42_xkh/request1
System.out.println(request.getRequestURI());///01_servlet_HelloWorld_war/request1
//獲取一個url的參數(shù)部分
//比如 http://localhost:8080/01_servlet_HelloWorld_war/request1?username=goudan
System.out.println(request.getParameter("username"));
//獲取前端傳送過來的數(shù)據(jù)
request.setCharacterEncoding("utf-8");//設(shè)置請求的編碼集
//給request這個對象設(shè)置數(shù)據(jù)
request.setAttribute("name","狗蛋");
//獲取request對象的值
request.getAttribute("name");
//獲取上下文對象
ServletContext servletContext = request.getServletContext();
//轉(zhuǎn)發(fā)
request.getRequestDispatcher("target.jsp").forward(request,response);
}
}
12 Response對象
是什么
響應(yīng)對象,把數(shù)據(jù)給客戶端 我們的Servlet緊緊圍繞著兩個點(Request,Response)請求和響應(yīng)
常用方法
setHeader() //設(shè)置響應(yīng)頭的參數(shù)
setContentType() //設(shè)置字符編碼集
getWriter() //獲取字符輸出流對象
addCookie() //對瀏覽器新增一個Cookie
sendRedirect() //重定向
servlet實例
package com.by.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 ResponseServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws Exception{
/**************亂碼問題*****/
//方式一
response.setCharacterEncoding("utf-8");//設(shè)置 HttpServletResponse使用utf-8編碼
response.setHeader("Content-Type",
"text/html;charset=utf-8");//通知瀏覽器使用utf-8解碼
//方式二
response.setContentType("text/html;charset=utf-8;aaa=bbb"); //包含方法一的兩個功能
//向客戶端發(fā)送響應(yīng)數(shù)據(jù)
response.getWriter().write("
hello");
/************重定向***********/
//方式一
//在響應(yīng)頭中添加302狀態(tài)碼,告訴瀏覽器需要進行重定向
response.setStatus(302);
//在響應(yīng)頭中添加Location,指定重定向的位置
response.setHeader("Location", "http://www.baidu.com");
//方式二
response.sendRedirect("http://www.baidu.com"); //包含方法一的兩個功能
}
}
柚子快報邀請碼778899分享:Servlet見解2
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。