目录

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初始化方法
    @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文件 

2.3、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp/xml/ns/javaee"
         xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp/xml/ns/javaee http://xmlns.jcp/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/abx
   http://ip:端口/abc/bdsf 

3、扩展名匹配     *.扩展名     注意:  *.扩展名(正确)   /*.扩展名(错误)
	<url-pattern>*.do</url-pattern>
	<url-pattern>*.action</url-pattern>
    *.do 
	*.action

2.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 {

    @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);
    }
}

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快速入门