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