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-->
<url-pattern>/do/*</url-pattern>
可匹配访问方式:
http://localhost:8080/day04_2/do/adc<url-pattern>/*</url-pattern>
什么都匹配
注意:
- 一个类属性名必须大于等于两个字符,并且名称的前两个字符大小写必须一致。
“*”
必须是两头,要么是最前面,要么最后,例如:/*.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