SpringBoot 官方文件中文版 - 7. 執行您的應用
阿新 • • 發佈:2021-07-25
一、Servlet簡介
1.sun公司開發動態web的一門技術。
2.sun公司在這些API中提供一個介面叫做:Servlet, 若想開發一個Servlet程式,完成兩個步驟: 編寫一個類,實現Servlet介面 把開發好的java類部署到web伺服器中
把實現了Servlet介面的java程式叫做,Servlet
二、HelloServlet
Servlet介面在Sun公司有兩個預設的實現類:HttpServlet GenericServlet
1.構建一個普通的Maven專案,刪掉裡面的src目錄,以後我們的學習就在這個專案裡建立Moudel; 這個空的工程就是Maven主工程。
2.關於Maven父子工程的理解:
父專案中會有
<modules>
<module>javaweb-01</module>
</modules>
子專案中會有
<parent>
<groupId>javaweb-02-servlet</groupId>
<artifactId>javaweb-servlet</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
父專案中的java子專案可以直接使用。
son extends father
3.Maven環境優化
修改web.xml為最新的
將Maven的結構搭建完整
4.編寫一個Servlet程式
編寫一個普通類
實現Servlet介面,這裡我們直接繼承HttpServlet。
5.編寫Servlet的對映
為什麼需要對映:寫的是Java程式,但要通過瀏覽器訪問,而瀏覽器需要連線web伺服器,所以要在web服務中註冊我們寫的Servlet,還需要給他一個瀏覽器能夠訪問的路徑。
<!--註冊servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.drigon.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的請求路徑-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
6.配置Tomcat
注意:配置專案釋出的路徑就可以了
7.啟動測試
三、Servlet原理
servlet是由Web伺服器呼叫,web伺服器在收到瀏覽器請求之後,會:
四、Mapping問題
1、一個Servlet請求可以指定一個對映路徑。
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2、一個Servlet請求可以指定多個對映路徑。
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello1</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>
3、一個Servlet請求可以指定通用對映路徑。
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
4、預設請求路徑
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5、指定一些字尾或字首等等
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.drigon</url-pattern>
</servlet-mapping>
可以自定義字尾實現請求路徑(注意:*前面不能加專案對映的路徑)
6、優先順序問題
指定了固有的對映路徑,優先順序最高,如果找不到就會走預設的處理請求。
四、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 i = this.getServletContext();
String username = "longge"; //資料
getServletContext().setAttribute("username",username); //將一個數據儲存在了ServletContext中,名字為username,值為uesrname
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
讀取的類
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;charset=utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
配置web.xml
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.drigon.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.drigon.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 = getServletContext();
String url = context.getInitParameter("url");//獲得初始化的引數 可以變為一個字串
//context.getInitParameterNames() //可以變為一個列舉型別
resp.getWriter().print(url);
}
3、請求轉發
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("進入了Servlet02");
//context.getRequestDispatcher("/gp").forward(req,resp); //請求轉發
RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//轉發的請求路徑
requestDispatcher.forward(req,resp);//呼叫forward實現請求轉發 路徑不會發生改變
}
4、讀取資原始檔(Properties)
在java目錄下新建properties
在resources目錄下新建properties
發現都被打包到了同一個路徑下:classes,我們俗稱這個路徑為classpath(類路徑)。
思路:需要一個檔案流
//配置檔案
username= root
password= 123456
public class Servlet03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop = new Properties();
prop.load(is);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
resp.getWriter().print(user+":"+pwd);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
訪問測試即可。