GenericServlet和HttpServlet

ServletRequest和ServletResponse真实的类型是HttpServletRequst和HttpServletResponse,可将ServletRequest类型对象强制转化成HttpServletRequest类型。

HttpServletRequest

  • String getParameter(String name):获取指定参数值。
    实例
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        String username=req.getParameter("username");
        String password=req.getParameter("password");

        res.getWriter().print("hello!你的用户名为:"+username+",您的密码为:"+password);
    }

web.xml配置

<servlet>
      <servlet-name>BServlet</servlet-name>
      <servlet-class>cn.my.servlet.BServlet</servlet-class>     
  </servlet>
    <servlet-mapping>
      <servlet-name>BServlet</servlet-name>
      <url-pattern>/b_servlet</url-pattern>
  </servlet-mapping>

结果
这里写图片描述

GenericServlet

是Servlet接口的 实现类,我们可以继承GenericServlet来编写自己的Servlet。

  • 直接使用this.getInitParameter()方法,来获取初始化参数。
  • 直接使用this.getServletContext(),来获取ServletContext对象。
  • 要求:如果需要做初始化参数,不能再去覆盖init(ServletConfig),而是去覆盖GenericServlet直接提交的init()。
class MyGenericServlet extends GenericServlet{
    public void service(ServletRequest request , ServletResponse response){
    String p1=this.getInitParameter("p1");

    //这个方法是GenericServlet自己提供的,他不是Servlet的生命周期方法。
    //因为在GenericServlet的init(ServletConfig)方法会调用init()方法。
    //默认init()方法是没有内容的。
    public void init(){
        System.out.println("servlet出生了");
    }
}

实例

/**
 * 如果希望添加初始化操作,那么不要去覆盖init(ServletConfig)方法,而是去覆盖init()方法
 * init()方法是GenericServlet提供的,他不是生命周期方法,它会被生命周期方法调用。
 * @author green
 *
 */
public class MyGenericServlet extends GenericServlet {
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        String pp1=this.getInitParameter("pp1");//得到pp1的值
        PrintWriter out=res.getWriter();
        out.print(pp1);
    }
}

web.xml配置

<servlet>
      <servlet-name>MyGenericServlet</servlet-name>
      <servlet-class>cn.my.servlet.MyGenericServlet</servlet-class>   
      <init-param>
      <!--参数-->
         <param-name>pp1</param-name>
         <param-value>vv1</param-value>
   </init-param>  
 </servlet>

  <servlet-mapping>
      <servlet-name>MyGenericServlet</servlet-name>
      <url-pattern>/generic_servlet</url-pattern>
  </servlet-mapping>

这里写图片描述

HttpServlet

它是GenericServlet得到子类。
它是专注与HTTP请求的Servlet(我们这都是HTTP请求)。
在HttpServlet中只需要覆盖doGet()或doPost()即可,不能再覆盖service()方法。

public void servlet(ServletRequest request , ServletResponse response) {
    HttpServletRequest req=(HttpServletRequest)request;
    HttpServletResponse res=(HttpServletResponse)response;
    service(req,res);
}
public service(HttpServletRequest,HttpServletRespose response){
    String method=request.getMethod();//获取当前的请求方式,可能是GET也可能是POST
    if(method.equals("GET"))
    doGet(request,response);
    else if(method.equals("POST"))
    doPost(request,response);
}
public void doGet(ServletRequest request , ServletResponse response){
    //向客户端响应405状态码
}
public void doPost(ServletRequest request , ServletResponse response){
    //向客户端响应405状态码
}

doGet(0和doPost()都不是抽象的,也不是空方法,响应为405,表示客户端出错。不覆盖方法调用响应为405.

servlet总结:

1、servlet是单例的
2、servlet是线程不安全的
3、<load-on-startup>,指定当前servlet在服务器启动时就创建实例,如果有多个servlet被指定为服务器启动即创建实例,那么这个值就是用来指定创建的顺序。

<servlet>
    ...
    <load-on-startup>0</load-on-startup>
</servlet>
<servlet>
    ...
    <load-on-startup>1</load-on-startup>
</servlet>

使用<load-on-startup>的值进行排序,确定进行创建的顺序,该值不能为负。
4、<url-pattern>

<servlet>
    <servlet-name>abc</servlet-name>
    <servlet-class>cn.my.servlet.AServlet</servlet-class>
    </servlet>
<servlet-mapping>
    <servlet-name>abc</servlet-name>
    <url-pattern>/a_servlet</url-pattern>
    <url-pattern>/b_servlet</url-pattern>
</servlet-mapping>
<!-- 
http://localhost:8080/day04_2/a_servlet
http://localhost:8080/day04_2/b_servlet
以上两个都是在访问AServlet这个类。
-->
<!-- ..........上面换个写法.................-->
<servlet-mapping>
    <servlet-name>abc</servlet-name>
    <url-pattern>/a_servlet</url-pattern>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <!-- 其中*就是通配符,它匹配所有字母。
   http://localhost:8080/day04_2/sdf.do
   http://localhost:8080/day04_2/a/b/csds.do-->

注意:

  • 一个类属性名必须大于等于两个字符,并且名称的前两个字符大小写必须一致。
  • “*”必须是两头,要么是最前面,要么最后,例如:/*.do,是错误的。
  • <url-pattern>中可以使用通配符开头,或是“/”开头。

web.xml文件继承

完整的javaweb应用中都需要有web.xml。但我们不知道所有的web.xml文件都有一个共同的父文件,他在Tomcat的conf/web.xml路径。
父web.xml

  • 定义了一个defualt的servelt,这个servelt在资源找不到时执行,它会响应404页面。
  • 定义了一个jsp的sehrvlet。
  • seddion的超时时间为30分钟。
  • Mine类型。
  • 还定义欢迎页。index.html,index.htm,index.jsp

猜你喜欢

转载自blog.csdn.net/green703338130/article/details/79460250