1、Servlet
1.1、Servlet簡介
- Servlet就是sun公司開發動態web的一門技術
- Sun在這些API中提供一個介面叫做:Servlet,如果你想開發一個Servlet程式,只需要完成兩個小步驟:
- 撰寫一個類,實作Servlet介面
- 把開發好的Java類部署到web服務器中,
把實作了Servlet介面的Java程式叫做,Servlet
1.2、HelloServlet
Serlvet介面Sun公司有兩個默認的實作類:HttpServlet,GenericServlet
-
構建一個普通的Maven專案,刪掉里面的src目錄,以后我們的學習就在這個專案里面建立Moudel;這個空的工程就是Maven主工程;
-
關于Maven父子工程的理解:
父專案中會有
<modules> <module>servlet-01</module> </modules>子專案會有
<parent> <artifactId>javaweb-02-servlet</artifactId> <groupId>com.wei</groupId> <version>1.0-SNAPSHOT</version> </parent>父專案中的java子專案可以直接使用
son extends father -
Maven環境優化
- 修改web.xml為最新的
- 將maven的結構搭建完整
-
撰寫一個Servlet程式

-
撰寫一個普通類
-
實作Servlet介面,這里直接繼承HttpServlet
public class HelloServlet extends HttpServlet { //由于get或者post只是請求實作的不同的方式,可以相互呼叫,業務邏輯都一樣; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter(); //回應流 writer.print("Hello,Serlvet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } } -
撰寫Servlet的映射
為什么需要映射:我們寫的是JAVA程式,但是要通過瀏覽器訪問,而瀏覽器需要連接web服務器,所以我們需要再web服務中注冊我們寫的Servlet,還需給他一個瀏覽器能夠訪問的路徑;
<!--注冊Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.wei.servlet.HelloServlet</servlet-class> </servlet> <!--Servlet的請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> -
配置Tomcat
注意:配置專案發布的路徑,
-
啟動測驗,OK!
1.3、Servlet原理
Servlet是由Web服務器呼叫,web服務器在收到瀏覽器請求之后,會:

1.4、Mapping問題
-
一個Servlet可以指定一個映射路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> -
一個Servlet可以指定多個映射路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello4</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello5</url-pattern> </servlet-mapping> -
一個Servlet可以指定通用映射路徑
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping> -
默認請求路徑
<!--默認請求路徑--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> -
指定一些后綴或者前綴等等….
<!--可以自定義后綴實作請求映射 注意點,*前面不能加專案映射的路徑 hello/sajdlkajda.xiaohang --> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.xiaohang</url-pattern> </servlet-mapping> -
優先級問題
指定了固有的映射路徑優先級最高,如果找不到就會走默認的處理請求;<!--404--> <servlet> <servlet-name>error</servlet-name> <servlet-class>com.wei.servlet.ErrorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>error</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
1.5、ServletContext
web容器在啟動的時候,它會為每個web程式都創建一個對應的ServletContext物件,它代表了當前的web應用;
1、共享資料
我在這個Servlet中保存的資料,可以在另外一個servlet中拿到;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter() 初始化引數
//this.getServletConfig() Servlet配置
//this.getServletContext() Servlet背景關系
ServletContext context = this.getServletContext();
String username = "小杭呀"; //資料
context.setAttribute("username",username); //將一個資料保存在了ServletContext中,名字為:username ,值 username
}
}
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = (String) context.getAttribute("username");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.wei.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.wei.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
測驗訪問結果;
2、獲取初始化引數
<!--配置一些web應用初始化引數-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
3、請求轉發
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("進入了ServletDemo04");
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //轉發的請求路徑
//requestDispatcher.forward(req,resp); //呼叫forward實作請求轉發;
context.getRequestDispatcher("/gp").forward(req,resp);
}

4、實作重定向

B一個web資源收到客戶端A請求后,B他會通知A客戶端去訪問另外一個web資源C,這個程序叫重定向
常見場景:
- 用戶登錄
void sendRedirect(String var1) throws IOException;
測驗:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
resp.setHeader("Location","/r/img");
resp.setStatus(302);
*/
resp.sendRedirect("/r/img");//重定向
}
面試題:請你聊聊重定向和轉發的區別?
相同點
- 頁面都會實作跳轉
不同點
- 請求轉發的時候,url不會產生變化
- 重定向時候,url地址欄會發生變化;

5、簡單實作登錄重定向
<%--這里提交的路徑,需要尋找到專案的路徑--%>
<%--${pageContext.request.contextPath}代表當前的專案--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用戶名:<input type="text" name="username"> <br>
密碼:<input type="password" name="password"> <br>
<input type="submit">
</form>
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//處理請求
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println(username+":"+password);
//重定向時候一定要注意,路徑問題,否則404;
resp.sendRedirect("/r/success.jsp");
}
<servlet>
<servlet-name>requset</servlet-name>
<servlet-class>com.wei.servlet.RequestTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>requset</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/258715.html
標籤:java
上一篇:SpringBoot首頁設定決議
