目录
2.6、修改快速创建模版(针对以上模版不一致或者webServlet中请求路径没有/)
5、ServletConfig和ServletContext
Servlet 是sun公司提供的一门用于开发动态web资源的技术 Servlet 是基于Request Response编程模型 Sun公司在其API提供了一个servlet接口,用户若想开发一套动态的web项目,需要完成以下2步骤:
1、编写一个java类,实现servlet接口。
2、把开发好的程序布署到服务器中。

servlet的作用:
1、接受浏览器发送过来的消息。
2、给浏览器返回消息,浏览器认识html,可以动态去输出html。Request:请求。客户端向服务端发送的信息。
Response:响应。服务器向客户端发送的信息。
通常请求和响应是成对出现的。
在实现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类
- public class MyServlet implements Servlet {
- //servlet初始化方法
- @Override
- public void init(ServletConfig servletConfig) throws ServletException {
- System.out.println("==========servlet init===========");
- }
-
- @Override
- public ServletConfig getServletConfig() {
- return null;
- }
-
- //业务方法
- @Override
- public 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);
- }
-
- @Override
- public String getServletInfo() {
- return null;
- }
-
- //servlet销毁方法
- @Override
- public void destroy() {
- System.out.println("==========servlet destroy===========");
- }
- }
写好这个servlet类就能够完成了吗,还不行,需要进行配置web.xml文件
- "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>MyServletservlet-name>
-
- <servlet-class>cn.itssl.servlet.MyServletservlet-class>
- servlet>
- <servlet-mapping>
-
- <servlet-name>MyServletservlet-name>
-
- <url-pattern>/MyServleturl-pattern>
- servlet-mapping>
-
-
- web-app>
启动Tomcat服务器

在浏览器地址栏中输入localhost:8080/MyServlet,注意:这里8080后面的内容就是配置文件url-pattern标签写的内容


可以看到,点击回车后,idea控制台输出了我在初始方法和service方法中写的输出语句,servlet被成功的初始化了,后面是null是因为我在地址栏没有提交一个参数,所以获取到的是null,现在我提交一个参数username看看效果


可以看到service方法又被调用了,而且参数username也被输出到了控制台。可以发现初始化方法只被执行了一次,后面再提交就不会调用了。
- 1、完全路径匹配,以”/”开头 后面是具体的路径信息。
- 你输入什么内容。访问的时候,就需要输入什么内容,才可以找到对应的servlet
- 例如
- <url-pattern>/hellourl-pattern>
-
- 2、目录匹配,以/*结尾
- <url-pattern>/*url-pattern>
- http://ip:端口/abc/abx
- http://ip:端口/abc/bdsf
-
- 3、扩展名匹配 *.扩展名 注意: *.扩展名(正确) /*.扩展名(错误)
- <url-pattern>*.dourl-pattern>
- <url-pattern>*.actionurl-pattern>
- *.do
- *.action
重写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);
- }
- }
如果出现以上模版中不一样,或者说请求路径是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);
- }
- }
我们思考一个问题,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包中

在html里,我们需要通过form表单请求到后台,action中的地址就是我们发送请求到的servlet地址,这里可以使用绝对地址,顾名思义,就是整个地址都得写上
- <form action="http://localhost:8081/ServletDemo" method="post">
-
- form>
相对路径就只用写上servlet中的请求路径
- <form action="/ServletDemo" method="post">
-
- form>
servletConfig 是一个对象。javaee规范中定义的一个对象。要求web服务器(tomcat),创建一个servlet的同时,也要去创建一个servletConfig对象。还要给servlet去使用。
serlvetConfig 是我们servlet 一些的配置信息。如果一个servlet 使用的过程中需要一些参数信息。这些参数信息,可以配置到servletConfig中。 之后servlet去使用。
- <servlet>
- <servlet-name>ServletConfig01servlet-name>
- <servlet-class>cn.itssl.config.ServletConfig01servlet-class>
-
- <init-param>
- <param-name>charsetparam-name>
- <param-value>utf-8param-value>
- init-param>
- servlet>
- <servlet-mapping>
- <servlet-name>ServletConfig01servlet-name>
- <url-pattern>/ServletConfig01url-pattern>
- servlet-mapping>
原生配置xml方式
- public class ServletConfig01 implements Servlet {
-
- @Override
- public void init(ServletConfig servletConfig) throws ServletException {
- //通过servletConfig对象获取到web.xml下配置的参数内容
- String charset = servletConfig.getInitParameter("charset");
- System.out.println(charset);
-
- }
-
- @Override
- public ServletConfig getServletConfig() {
- return null;
- }
-
- @Override
- public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
-
- }
-
- @Override
- public String getServletInfo() {
- return null;
- }
-
- @Override
- public 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);
- }
- }
在ServletConfig对象中可以看出该对象只能为当前servlet进行参数赋值,也就是说每一个servlet的参数都是独立的,如果以后有上百个servlet都要为其赋值charset字符集,那么重复的设置是很繁琐的,所以ServletContext就可以解决这个问题,它是全局设置参数。
ServletContext是整个web项目应用程序运行后的代表对象。(代表当前一个项目)可以通过ServletConfig的getServletContext() 的方法得到,然后可以用该对象取得整个应用程序的相关资源或者信息。
-
- <context-param>
- <param-name>charsetparam-name>
- <param-value>utf-8param-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);
- }
- }
ServletConfig:
一个servlet被实例化后,对任何客户端在任何时候访问有效,但仅对本servlet
有效,一个servlet的ServletConfig对象不能被另一个servlet访问。
ServletContext:
对任何servlet,任何人在任何时间都有效,等于是全局的对象。