Servlet

一、什么是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");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值