Servlet快速入门
目錄
1、Servlet簡介
2、代碼實現
2.1、環境準備
2.2、實現servlet接口
2.3、配置web.xml文件
2.4、url-pattern的三種配置方式
2.5、快速創建Servlet
2.6、修改快速創建模版(針對以上模版不一致或者webServlet中請求路徑沒有/)
3、項目部署位置(面試題)
4、絕對路徑和相對路徑
4.1、絕對路徑
4.2、相對路徑
5、ServletConfig和ServletContext
5.1、ServletConfig
5.2、ServletContext
5.3、兩者區別
?
1、Servlet簡介
Servlet 是sun公司提供的一門用于開發動態web資源的技術 Servlet 是基于Request Response編程模型 Sun公司在其API提供了一個servlet接口,用戶若想開發一套動態的web項目,需要完成以下2步驟:
1、編寫一個java類,實現servlet接口。
2、把開發好的程序布署到服務器中。
servlet的作用:
1、接受瀏覽器發送過來的消息。
2、給瀏覽器返回消息,瀏覽器認識html,可以動態去輸出html。
Request:請求。客戶端向服務端發送的信息。
Response:響應。服務器向客戶端發送的信息。
通常請求和響應是成對出現的。
2、代碼實現
2.1、環境準備
在實現servlet之前,我們需要配置一下tomcat,因為tomcat里面有servlet相關jar包,如果不導入tomcat,那么servlet的方法是不能被使用的。
在idea右上角有個Edit Configurations選項,點擊打開?
選擇Templates,往下尋找Tomcat Server?
找到Tomcat Server,選擇Local(本地)
?
點擊右上角有個Configure按鈕,點擊打開?
在下面的選框中導入Tomcat的路徑后點擊OK。
?
把JRE框中選擇使用你電腦安裝的JDK,這里我用的是JDK1.8。
點擊Apply后OK。
之后,點擊左上角加號
?找到Tomcat Server,并點擊Local
?
點擊Deployment后點擊后邊的+號,
?選擇Artifact添加項目
?
?出現以下畫面就代表添加成功,建議把下面的Application context請求路徑改為/
首先創建一個web項目,然后創建一個servlet包用來存放servlet類
創建第一個Servlet類
2.2、實現servlet接口
public class MyServlet implements Servlet {//servlet初始化方法@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("==========servlet init===========");}@Overridepublic ServletConfig getServletConfig() {return null;}//業務方法@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("=============servlet service============");//servletRequest對象強轉為HttpServletRequest對象HttpServletRequest request=(HttpServletRequest) servletRequest;String username = request.getParameter("username");System.out.println(username);}@Overridepublic String getServletInfo() {return null;}//servlet銷毀方法@Overridepublic void destroy() {System.out.println("==========servlet destroy===========");} }寫好這個servlet類就能夠完成了嗎,還不行,需要進行配置web.xml文件?
2.3、配置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-name填寫servlet類名--><servlet-name>MyServlet</servlet-name><!--servlet-class填寫servlet類的路徑--><servlet-class>cn.itssl.servlet.MyServlet</servlet-class></servlet><servlet-mapping><!--注意:這里的name名必須與上面servlet標簽內的name名一致--><servlet-name>MyServlet</servlet-name><!--請求地址,這里推薦使用/類名--><url-pattern>/MyServlet</url-pattern></servlet-mapping></web-app>啟動Tomcat服務器
在瀏覽器地址欄中輸入localhost:8080/MyServlet,注意:這里8080后面的內容就是配置文件url-pattern標簽寫的內容?
?
可以看到,點擊回車后,idea控制臺輸出了我在初始方法和service方法中寫的輸出語句,servlet被成功的初始化了,后面是null是因為我在地址欄沒有提交一個參數,所以獲取到的是null,現在我提交一個參數username看看效果
?
可以看到service方法又被調用了,而且參數username也被輸出到了控制臺。可以發現初始化方法只被執行了一次,后面再提交就不會調用了。
2.4、url-pattern的三種配置方式
1、完全路徑匹配,以”/”開頭 后面是具體的路徑信息。你輸入什么內容。訪問的時候,就需要輸入什么內容,才可以找到對應的servlet例如<url-pattern>/hello</url-pattern>2、目錄匹配,以/*結尾<url-pattern>/*</url-pattern> http://ip:端口/abc/abxhttp://ip:端口/abc/bdsf 3、擴展名匹配 *.擴展名 注意: *.擴展名(正確) /*.擴展名(錯誤)<url-pattern>*.do</url-pattern><url-pattern>*.action</url-pattern>*.do *.action2.5、快速創建Servlet
重寫Servlet雖然能夠獲取request與response對象獲取參數,但是還必須每次都得進行強轉,而且重寫方法里面只有service方法會被用到,其他方法大部分是用不到的,那么我們需要去快速創建一個簡潔方便的servlet類。借助idea開發工具可以快速的創建servlet
1、自己去定義的servlet 只需要繼承HttpServlet 就可以實現 servlet的接口了。
2、以后處理用戶的請求,都寫在doGet或者doPost方法中。
在新建里面找到servlet選項?
?只需要修改名字就可以,其他路徑都不用動,修改完名字點擊OK。?
?
這個模版里面使用了注解形式設置請求路徑,所以就不用在web.xml配置文件中設置servlet以及servlet-mapping標簽了。?
@WebServlet(urlPatterns = "/RegisterServlet") public class RegisterServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String username = request.getParameter("username");String pwd = request.getParameter("pwd");System.out.println("用戶名:"+username+" 密碼:"+pwd);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }2.6、修改快速創建模版(針對以上模版不一致或者webServlet中請求路徑沒有/)
如果出現以上模版中不一樣,或者說請求路徑是name=xxxx,沒有/的情況,那么跟著一下操作進行修改模版
點擊File中的Settings設置?
點擊Editor,找到File and Code Templates,在右側面板中找到Other,找到Web點擊后Java code templates,找到Servlet Annotated Class.java?
?把以下代碼放入到模版框內
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse("File Header.java") @javax.servlet.annotation.WebServlet(urlPatterns="/${Entity_Name}") public class ${Class_Name} extends javax.servlet.http.HttpServlet {protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {}protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {this.doPost(request,response);} }3、項目部署位置(面試題)
我們思考一個問題,tomcat里面如何部署一個項目,肯定是放在了tomcat里面的webapps,那我們去項目中找一下
發現并沒有項目的包,那么就很疑惑,沒有放到tomcat的webapps中,項目是怎么在tomcat中跑起來的呢?
其實真正的項目是在C:\Users\Administrator\.IntelliJIdea2018.3\system\tomcat\Tomcat_9_0_54_day02_servlet\conf\Catalina\localhost\ROOT.xml
context標簽中的docBase的作用就是從此路徑尋找項目?
可以看到,打開這個路徑,找到了我們項目寫的web下的頁面
然而java代碼就被放在了WEB-INF的classes包中
?
4、絕對路徑和相對路徑
4.1、絕對路徑
在html里,我們需要通過form表單請求到后臺,action中的地址就是我們發送請求到的servlet地址,這里可以使用絕對地址,顧名思義,就是整個地址都得寫上
<form action="http://localhost:8081/ServletDemo" method="post"></form>4.2、相對路徑
相對路徑就只用寫上servlet中的請求路徑
<form action="/ServletDemo" method="post"></form>5、ServletConfig和ServletContext
5.1、ServletConfig
servletConfig 是一個對象。javaee規范中定義的一個對象。要求web服務器(tomcat),創建一個servlet的同時,也要去創建一個servletConfig對象。還要給servlet去使用。
serlvetConfig 是我們servlet 一些的配置信息。如果一個servlet 使用的過程中需要一些參數信息。這些參數信息,可以配置到servletConfig中。 之后servlet去使用。
<servlet><servlet-name>ServletConfig01</servlet-name><servlet-class>cn.itssl.config.ServletConfig01</servlet-class><!--給當前servlet配置一些參數--><init-param><param-name>charset</param-name><param-value>utf-8</param-value></init-param></servlet><servlet-mapping><servlet-name>ServletConfig01</servlet-name><url-pattern>/ServletConfig01</url-pattern></servlet-mapping>原生配置xml方式?
public class ServletConfig01 implements Servlet {@Overridepublic void init(ServletConfig servletConfig) throws ServletException {//通過servletConfig對象獲取到web.xml下配置的參數內容String charset = servletConfig.getInitParameter("charset");System.out.println(charset);}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {} }通過注解形式?
@WebServlet(urlPatterns = "/ServletConfig02", initParams = {@WebInitParam(name = "charset", value = "utf-8"), @WebInitParam(name = "charset2", value = "GBK")}) public class ServletConfig02 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String charset = this.getServletConfig().getInitParameter("charset");response.setContentType("text/html;charset="+charset);//如果不設置字符集在頁面會出現亂碼response.getWriter().write("我愛你中國");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }5.2、ServletContext
在ServletConfig對象中可以看出該對象只能為當前servlet進行參數賦值,也就是說每一個servlet的參數都是獨立的,如果以后有上百個servlet都要為其賦值charset字符集,那么重復的設置是很繁瑣的,所以ServletContext就可以解決這個問題,它是全局設置參數。
ServletContext是整個web項目應用程序運行后的代表對象。(代表當前一個項目)可以通過ServletConfig的getServletContext() 的方法得到,然后可以用該對象取得整個應用程序的相關資源或者信息。
<!--配置全局參數,所有的servlet都可以進行訪問--><context-param><param-name>charset</param-name><param-value>utf-8</param-value></context-param> @WebServlet(urlPatterns = "/ServletContext01") public class ServletContext01 extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String charset = this.getServletContext().getInitParameter("charset");response.setContentType("text/html;charset="+charset);response.getWriter().write("我愛你中國");}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);} }5.3、兩者區別
ServletConfig:
?? ?一個servlet被實例化后,對任何客戶端在任何時候訪問有效,但僅對本servlet
? ? 有效,一個servlet的ServletConfig對象不能被另一個servlet訪問。
ServletContext:
?? ?對任何servlet,任何人在任何時間都有效,等于是全局的對象。
總結
以上是生活随笔為你收集整理的Servlet快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Servlet入门案例
- 下一篇: 保护性拷贝(defensive copy