一、什么是Servlet?
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况Servlet只用来扩展基于HTTP协议的Web服务器。
二、xml的配置
<servlet>
<servlet-name>SessionServlet</servlet-name>
<servlet-class>com.zzu.servlet.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionServlet</servlet-name>
<url-pattern>/ss</url-pattern>
</servlet-mapping>
三、Servlet的生命周期
1、从第一次调用到服务器关闭。
2、如果Servlet在web.xml中配置了load-on-startup,生命周期为从服务器启动到服务器关闭
注意:
(a)、init()方法是对Servlet进行初始化的一个方法,会在Servlet第一次加载进行存储时执行
(b)、destory()方法是在servlet被销毁时执行,也就服务器关闭时。
四、Service方法和doGet方法和doPost方法的区别
1、Service方法:可以处理get/post方式的请求,如果servlet中有Service方法,会优先调用service方法对请求进行处理。
2、doGet方法:处理get方式的请求
3、doPost方法:处理post方式的请求
注意:如果在覆写的service方法中调用了父类的service方法(super.service(arg0, arg1)),则service方法处理完后,会再次根据请求方式响应的doGet和doPost方法执行。所以,一般情况下,我们是不在覆写的service中调用父类的service方法的,避免出现405错误。
五、Servlet的常见错误
1、404错误:资源未找到
原因一:在请求地址中的servlet的别名书写错误。
原因二:虚拟项目名称拼写错误
2、500错误:内部服务器错误
错误一: java.lang.ClassNotFoundException: com.bjsxt.servlet.ServletMothod
解决:在web.xml中校验servlet类的全限定路径是否拼写错误。
错误二:service方法体的代码执行错误导致
解决:根据错误提示对service方法体中的代码进行错误更改。
3、405错误:请求方式不支持
原因:请求方式和servlet中的方法不匹配所造成的。
解决:尽量使用service方法进行请求处理,并且不要再service方法中调用父类的service。
六、Request对象
作用:request对象中封存了当前请求的所有请求信息,解决了一次请求内的servlet的数据共享问题。
注意:Request对象由tomcat服务器创建,并作为实参传递给处理请求的servlet的service方法。
使用:
1.获取请求行数据
//获取请求行数据
//获取请求方式
String method = req.getMethod();
//获取请求URL
StringBuffer url=req.getRequestURL();
//获取URI
String uri=req.getRequestURI();
//获取协议
String h=req.getScheme();
2.获取请求头数据
req.getHeader("键名"); //返回指定的请求头信息
String value=req.getHeader("aaa");
req.getHeaderNames(); //返回请求头的键名的枚举集合
Enumeration e = req.getHeaderNames();
while(e.hasMoreElements()){
String name=(String) e.nextElement();
String value2=req.getHeader(name);
System.out.println(name+":"+value2);
}
3.获取用户数据
req.getParameter("键名"); //返回指定的用户数据
String name=req.getParameter("uname");
String pwd=req.getParameter("pwd");
System.out.println(name+":"+pwd);
req.getParameterValues("键名");//返回同键不同值的请求数据(多选),返回的数组。
String[] favs=req.getParameterValues("fav");
if(favs!=null){
for(String fav:favs){
System.out.println(fav);
}
}
req.getParameterNames()//返回所有用户请求数据的枚举集合
注意:如果要获取的请求数据不存在,不会报错,返回null。
七、Respone对象
作用:用来响应数据到浏览器的一个对象
使用:
1.设置响应头
setHeader(String name,String value); //在响应头中添加响应信息,但是同键会覆盖。
addHeader(String name,String value); //在响应头中添加响应信息,但是不会覆盖。
resp.setHeader("mouse", "two fly birds");
resp.setHeader("mouse", "bjsxt");
resp.addHeader("key", "thinkpad");
resp.addHeader("key", "wollo");
2.设置响应状态
resp.sendError(int num,String msg);//自定义响应状态码。
resp.sendError(404, "this Method is not supported");
3.设置响应实体
resp.getWrite().write(String str);//响应具体的数据给浏览器
resp.getWriter().write("<b>今天天气真好,适合学习</b>");
4.设置响应编码格式:
resp.setContentType("text/html;charset=utf-8");
//resp.setHeader("content-type", "text/html;charset=utf-8");
//resp.setContentType("text/plain;charset=utf-8");
//resp.setContentType("text/xml;charset=utf-8");
resp.setContentType("text/html;charset=utf-8");
八、请求转发
作用:实现多个servlet联动操作处理请求,避免代码冗余,让servlet的职责更加明确。
使用:req.getRequestDispatcher("要转发的地址").forward(req, resp);
地址:相对路径,直接书写servlet的别名即可。
特点:一次请求,浏览器地址栏信息不改变。
注意:请求转发后直接return结束即可。
九、重定向
作用:解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
使用:resp.sendRedirect(String uri);
resp.sendRedirect("/login/main");
特点:两次请求,两个request对象,浏览器地址栏信息改变。
时机:
a、如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
b、如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
十、请求中文乱码解决
1、使用String进行数据重新编码
uname=new String(uname.getBytes("iso8859-1"),"utf-8");
2、使用公共配置
get方式:
步骤一:req.setCharacterEncoding("utf-8");
步骤二:在tomcat的目录下的conf目录中修改server.xml文件,在Connector标签中增加属性 useBodyEncodingForURI="true"
post方式:req.setCharacterEncoding("utf-8");