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>BServletservlet-name>
      <servlet-class>cn.my.servlet.BServletservlet-class>     
  servlet>
    <servlet-mapping>
      <servlet-name>BServletservlet-name>
      <url-pattern>/b_servleturl-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>MyGenericServletservlet-name>
      <servlet-class>cn.my.servlet.MyGenericServletservlet-class>   
      <init-param>
      
         <param-name>pp1param-name>
         <param-value>vv1param-value>
   init-param>  
 servlet>

  <servlet-mapping>
      <servlet-name>MyGenericServletservlet-name>
      <url-pattern>/generic_servleturl-pattern>
  servlet-mapping>

GenericServlet和HttpServlet_第1张图片

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、,指定当前servlet在服务器启动时就创建实例,如果有多个servlet被指定为服务器启动即创建实例,那么这个值就是用来指定创建的顺序。


    ...
    0


    ...
    1

使用的值进行排序,确定进行创建的顺序,该值不能为负。
4、

<servlet>
    <servlet-name>abcservlet-name>
    <servlet-class>cn.my.servlet.AServletservlet-class>
    servlet>
<servlet-mapping>
    <servlet-name>abcservlet-name>
    <url-pattern>/a_servleturl-pattern>
    <url-pattern>/b_servleturl-pattern>
servlet-mapping>


<servlet-mapping>
    <servlet-name>abcservlet-name>
    <url-pattern>/a_servleturl-pattern>
    <url-pattern>*.dourl-pattern>
  servlet-mapping>
  
  • /do/*
    可匹配访问方式:
    http://localhost:8080/day04_2/do/adc
  • /*什么都匹配

注意:

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

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

你可能感兴趣的:(javaweb)