本篇要点:
1、servlet入门准备
2、servlet生命周期
3、request和response对象
4、解决中文乱码
5、常用http响应码
6、小感悟
一、Servlet开发入门准备步骤
- 新建一个类继承自HttpServlet类,Tomcat服务器只认识servlet类,根据需要的业务逻辑实现业务操作,再在web.xml文件里映射配置对应servlet类。
- 最后配合Tomcat服务器部署程序就可以本地跑起来了。
若出现如下截图情况就是端口号被占用的问题,可参考我的另一篇文章来查看和关停相应的程序占用,或者修改所需的端口号。
//1、继承HttpServlet的类
import java.io.IOException;
import java.util.Date;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response){
try {
response.getWriter().println("Hello Servlet!
");
response.getWriter().println(new Date().toLocaleString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//2、web.xml配置文件
ServletDemo
HelloServlet
HelloServlet
HelloServlet
/hello
这里解释下以上web.xml配置文件中的调用流程,
另外,servlet是会随着Tomcat的启动而自启动的,而web.xml配置文件中的
Servlet的使用流程:
设置请求编码格式
设置响应编码格式
获取请求数据
处理请求
返回响应结果
数据的流转过程:
客户从浏览器发起请求到服务器,服务器接收到请求并解析,
创建request对象和response对象把请求数据存储到request对象中,
再把request对象和response对象作为实参传入调用对应的servlet执行,最后返回响应给浏览器。
二、Servlet生命周期
由实例化、初始化、提供服务、销毁、被回收 几个步骤组成。
- 当用户通过浏览器输入一个路径,这个路径对应的servlet被调用的时候,该Servlet就会被实例化,继承类的构造方法无论访问多少次都只执行一次,即Servlet是单实例的。
- init() 方法,初始化也只执行一次,是一个实例方法,所以会在构造方法执行后执行。
- 执行service()方法,然后通过浏览器传递过来的信息进行判断,是调用doGet()还是doPost()方法,也可区别form表单提交方式是get还是post方式,使用doGet()或者doPost()方法,这些方法是进行业务逻辑代码的编写的。service方法可以处理get/post请求,当service、doGet、doPost三个方法并存的时候,会优先执行service方法。在复写service方法时默认会认为调用了
super.service(request,response)
,否则的话,表示不管是get还是post方式请求,都会被service方法拦截并执行,就不会理doGet方法和doPost方法了。注意:一旦加上super.service(request,response)调用,那么在service执行完毕之后就需要根据请求方式自动调用doGet或者doPost,如果没有提供doGet或者doPost方法会报405错误。
- 当Servlet所在的web应用重新启动时以及关闭Tomcat的时候就会调用到destroy()方法进行销毁。
-
当Servlet被销毁后,就有可能被GC回收掉。
三、request和response对象常用方法解析
首先,我们要明白什么是request对象?request对象代表着浏览器向服务器发送请求,需要传递许多数据,于是把所有与请求相关的数据(请求头、请求行、数据)封装成一个request对象。
而response对象呢?代表着服务器返回给浏览器的数据,根据请求在服务器端找到资源后把相关的数据封装成一个response对象返回给客户端并由客户端去解析。
request.getParameter(String s)
:这是一个获取传递过来的单值参数的方法,即获取传到服务器的页面输入数据。
request.getParameterValues(String s)
:这是一个获取传递过来的多值参数的方法,即获取传到服务器的页面输入数据。
request.getParameterMap(String s)
:这是一个用来遍历所有的参数,并返回一个Map类型。
response.getWriter()
:这是一个 获取一个PrintWriter 对象的方法,一般用来返回给客户端的响应数据。
request.getRequestURL()
:获取浏览器发出请求时的完整URL,包括协议主机名端口。
request.getRequestURI()
:获取浏览器发出请求的资源名部分,即URL去掉协议和主机名。
request.getQueryString()
:获取请求行中参数部分,只能获取get方式传递的参数,post方式没办法看到。
request.getRemoteAddr()
:获取浏览器所处于客户机的IP地址。
request.getRemoteHost()
:获取浏览器所处于客户机的主机名。
request.getRemotePort()
:获取浏览器所处于客户机使用的网络端口。
request.getLocalAddr()
:获取服务器的IP地址。
request.getLocalName()
:获取服务器的主机名。
request.getHeader()
:这是一个用来获取浏览器传过来的头信息。比如getHeader("user-agent") 可以获取浏览器的基本资料,这可用来判断浏览器的类型,如firefox,ie等等。
request.getHeaderNames()
:获取浏览器所有的头信息名称,常用来根据头信息名称遍历所有的头信息。
request.getRequestDispatcher("要跳转的页面").forward(request,response)
:这是一个在service中用来执行服务端跳转的语句,即跳转页面后地址栏的路径仍然不会变化。俗称请求转发。
response.sendRedirect("要跳转的页面")
:这是一个在service中用来执行客户端跳转的语句,即跳转页面后地址栏的路径会变化。俗称请求重定向。
注:请求转发时会把当前的request和response对象转发给目标资源,而重定向会导致request和response对象的生命周期结束,从而在目标资源中无法获取一个jsp页面的request对象。请求转发直接在服务端运行,不会有网络时延,重定向则会有网络时延。
request.getAttribute("键名")
:用来获取request范围的设置属性,与
request.setAttribute(键,值)
对应,这是设置属性的,都是用来服务器传参,实现不同servlet之间的数据共享。 可参考这篇文章。
设置浏览器不使用缓存,如下
response.setDateHeader("Expires",0);
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma",no-cache");
四、解决中文乱码
1、获取中文参数
在html文件中使用标签声明编码,告诉服务器发送给你的数据是什么编码的。如下告诉服务器是UTF-8编码
然后在servlet中进行解码和编码,主要是弄清在哪个步骤中对应此刻的编码,然后根据相应方法进行解码编码
,如下
byte[] bytes= name.getBytes("ISO-8859-1");
name = new String(bytes,"UTF-8");
或者or
String name = reqpest.getParmeter("name");
name = new String(name.getBytes("iso8859-1"),"utf-8");
或者当使用post请求方式提交数据时,直接在使用request.getParmeter方法获取参数前指定对应的编码,如下:
request.setCharacterEncoding("UTF-8");
2、返回中文的响应
直接在servlet类中返回响应的部分代码前加上一句指定对应编码
response.setContentType("text/html; charset=UTF-8");
五、http协议常见响应码
- 200:表示响应成功
- 100:表示响应继续
- 301:表示客户端永久性跳转
- 302:表示客户端临时跳转,也表示重定向
- 304:表示这个资源没有该改变
- 404:表示访问资源不存在
- 500:表示服务端发生错误,即服务端程序有错误
- 403:表示禁止访问
- 401:表示未授权
- 408:表示请求超时
- 405:请求方式不支持
六、小感悟
使用servlet开发现如今已经过时了,因为它开发成本太大,返回一个网页需要编写的代码量繁琐,如下:
response.getWriter().write("");
response.getWriter().write("");
response.getWriter().write("");
response.getWriter().write("");
response.getWriter().write("");
response.getWriter().write("");
主要依靠request对象和response对象。但我觉得还是很有必要学习它,servlet相当于MVC架构中的C,servlet理解了,jsp和框架学习起来也就容易许多。