1. 程式人生 > 其它 >SpringBoot 官方文件中文版 - 7. 執行您的應用

SpringBoot 官方文件中文版 - 7. 執行您的應用

一、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);
}
訪問測試即可。