Servlet简单介绍及生命周期
2018-01-14 19:29
417 查看
Servlet及其作用
运行在服务器端的小程序,用来接收客户端的请求以及对客户端做出响应
编写Servlet
继承javax.servlet.http.HttpServlet(Http协议专用的Servlet)(最常用)
继承javax.servlet.GenericServlet类(协议无关,用在各种协议之上)
实现Servlet接口
编写Servlet的步骤
定义一个Servlet类,继承HttpServlet类
根据需要,重写doGet,doPost,service方法
doGet()方法用来处理客户端的GET请求
doPost()方法处理客户端的POST请求
service()方法(判断具体的请求方式,调用对应的方法)
添加映射URL
使用Annotation注解添加(@webServlet("/映射名"))
在web.xml文件中添加<servlet>和<servlet-mapping>标签进行配置
说明:使用注解时,容器(服务器)会创建一个Servlet实例,将这个实例映射到URL;使用web.xml配置时,servlet-name为容器创建servlet对象的引用名,url-pattern为这个对象的url映射
url映射可以使用通配符:
路径匹配/*,例如<url-pattern>/*</url-pattern>,表示当前工程路径名称下的任何一个url都被映射到同一个servlet
扩展名匹配:*.扩展名<url-pattern>*.do</url-pattern>,表示当前工程下任何以.do结尾的url都被映射到同一个servlet
在映射时,具体的url的优先级最高
客户端向服务器发送请求的方式
<form>表单 , action="url",通过submit按钮提交
直接在地址栏输入url
使用超链接的形式,访问url
使用js,location.href="URL";将当前页面的URL改为目标URL;window.open(URL),打开指定的URL
HttpServletRequest接口
这是在HTTP协议下一个用来接收用户请求信息的接口,由容器创建,并传给服务方法(service),这个接口继承ServletRequest接口(跨协议)
常用的方法
setCharacterEncoding("utf-8"):设置接收请求信息的字符集,
String getParameter("参数的name"):获得请求参数;
String[] getParameterValues("参数name"):获得同名的多个请求参数
Enumeration getParameterNames():获得所有参数名的集合
Map getParamerterMap():获得所有参数的键值对集合;
String getRemoteAddr():客户端ip
getRequestURL():请求地址
测试
重写Servlet中的doPost方法
html页面
后台输出结果
HttpServletReponse接口
用来响应客户端请求的接口,由容器创建,以参数的形式传递给service方法
常用的方法
setContentType():设置向客户端输出的内容类型 text/html;chraset=UTF-8
getWriter():获得输出字符流;
getOutputStream();获得字节流
sendRedirect();//重定向;
Servlet的生命周期
新生:new (容器 创建一个Servlet对象,只创建一次)
初始化:init()方法,服务器启动或第一次请求时调用(可以通过配置更改初始化的时间及顺序),只初始化一次;
提供服务:service(doGet/doPost),执行多次
销毁:destroy();执行一次(服务器关闭或出现异常时调用)
垃圾回收
测试,重写构造方法,service,init,destroy方法
当客户端进行访问时后台输出如下信息:
再次访问时
关闭服务器后台输出
运行在服务器端的小程序,用来接收客户端的请求以及对客户端做出响应
编写Servlet
继承javax.servlet.http.HttpServlet(Http协议专用的Servlet)(最常用)
继承javax.servlet.GenericServlet类(协议无关,用在各种协议之上)
实现Servlet接口
编写Servlet的步骤
定义一个Servlet类,继承HttpServlet类
根据需要,重写doGet,doPost,service方法
doGet()方法用来处理客户端的GET请求
doPost()方法处理客户端的POST请求
service()方法(判断具体的请求方式,调用对应的方法)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String method = req.getMethod(); if (method.equals(METHOD_GET)) { long lastModified = getLastModified(req); if (lastModified == -1) { // servlet doesn't support if-modified-since, no reason // to go through further expensive logic doGet(req, resp); } else { long ifModifiedSince = req.getDateHeader(HEADER_IFMODSINCE); if (ifModifiedSince < lastModified) { // If the servlet mod time is later, call doGet() // Round down to the nearest second for a proper compare // A ifModifiedSince of -1 will always be less maybeSetLastModified(resp, lastModified); doGet(req, resp); } else { resp.setStatus(HttpServletResponse.SC_NOT_MODIFIED); } } } else if (method.equals(METHOD_HEAD)) { long lastModified = getLastModified(req); maybeSetLastModified(resp, lastModified); doHead(req, resp); } else if (method.equals(METHOD_POST)) { doPost(req, resp); } else if (method.equals(METHOD_PUT)) { doPut(req, resp); } else if (method.equals(METHOD_DELETE)) { doDelete(req, resp); } else if (method.equals(METHOD_OPTIONS)) { doOptions(req,resp); } else if (method.equals(METHOD_TRACE)) { doTrace(req,resp); } else { // // Note that this means NO servlet supports whatever // method was requested, anywhere on this server. // String errMsg = lStrings.getString("http.method_not_implemented"); Object[] errArgs = new Object[1]; errArgs[0] = method; errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(HttpServletResponse.SC_NOT_IMPLEMENTED, errMsg); } }
添加映射URL
使用Annotation注解添加(@webServlet("/映射名"))
@WebServlet("/login")
在web.xml文件中添加<servlet>和<servlet-mapping>标签进行配置
<servlet> <servlet-name>first</servlet-name> <servlet-class>com.oracle.first.login</servlet-class> </servlet> <servlet-mapping> <servlet-name>first</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>
说明:使用注解时,容器(服务器)会创建一个Servlet实例,将这个实例映射到URL;使用web.xml配置时,servlet-name为容器创建servlet对象的引用名,url-pattern为这个对象的url映射
url映射可以使用通配符:
路径匹配/*,例如<url-pattern>/*</url-pattern>,表示当前工程路径名称下的任何一个url都被映射到同一个servlet
扩展名匹配:*.扩展名<url-pattern>*.do</url-pattern>,表示当前工程下任何以.do结尾的url都被映射到同一个servlet
在映射时,具体的url的优先级最高
客户端向服务器发送请求的方式
<form>表单 , action="url",通过submit按钮提交
直接在地址栏输入url
使用超链接的形式,访问url
使用js,location.href="URL";将当前页面的URL改为目标URL;window.open(URL),打开指定的URL
HttpServletRequest接口
这是在HTTP协议下一个用来接收用户请求信息的接口,由容器创建,并传给服务方法(service),这个接口继承ServletRequest接口(跨协议)
常用的方法
setCharacterEncoding("utf-8"):设置接收请求信息的字符集,
String getParameter("参数的name"):获得请求参数;
String[] getParameterValues("参数name"):获得同名的多个请求参数
Enumeration getParameterNames():获得所有参数名的集合
Map getParamerterMap():获得所有参数的键值对集合;
String getRemoteAddr():客户端ip
getRequestURL():请求地址
测试
重写Servlet中的doPost方法
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置字符集为utf-8 request.setCharacterEncoding("utf-8"); //获取参数 String name=request.getParameter("userName"); String password=request.getParameter("password"); System.out.println("userName:"+name+"\npassword:"+password); System.out.println("·······························"); //获取同名的参数 String[] hobby=request.getParameterValues("hobby"); System.out.println(Arrays.deepToString(hobby)); System.out.println("·······························"); //获取所有的参数名 Enumeration<String> e=request.getParameterNames(); //遍历输出 while(e.hasMoreElements()){ System.out.println(e.nextElement().toString()); } System.out.println("·······························"); //获取参数的键值对 Map<String, String[]> map=request.getParameterMap(); //遍历输出 Set<Entry<String, String[]>> set=map.entrySet(); for(Entry<String, String[]> entry:set){ System.out.println(entry.getKey()+":"+Arrays.deepToString(entry.getValue())); } System.out.println("·······························"); System.out.println("ip:"+request.getLocalAddr()); System.out.println("URL:"+request.getRequestURL()); }
html页面
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <form action="first" method="post"> userName<input type="text" name="userName"/><br/> password<input type="password" name="password"/><br/> hobby:<input type="checkbox" name="hobby" value="basketball"/>篮球 <input type="checkbox" name="hobby" value="football"/>足球 <input type="checkbox" name="hobby" value="pingpang"/>乒乓球 <input type="checkbox" name="hobby" value="baseball"/>棒球 <br/> <input type="submit" value="提交"/> <br/> </form> </body> </html>
后台输出结果
userName:James password:123456 ······························· [basketball, football, pingpang, baseball] ······························· userName password hobby ······························· userName:[James] password:[123456] hobby:[basketball, football, pingpang, baseball] ······························· ip:0:0:0:0:0:0:0:1 URL:http://localhost:8080/javaEE0112/first
HttpServletReponse接口
用来响应客户端请求的接口,由容器创建,以参数的形式传递给service方法
常用的方法
setContentType():设置向客户端输出的内容类型 text/html;chraset=UTF-8
getWriter():获得输出字符流;
getOutputStream();获得字节流
sendRedirect();//重定向;
Servlet的生命周期
新生:new (容器 创建一个Servlet对象,只创建一次)
初始化:init()方法,服务器启动或第一次请求时调用(可以通过配置更改初始化的时间及顺序),只初始化一次;
提供服务:service(doGet/doPost),执行多次
销毁:destroy();执行一次(服务器关闭或出现异常时调用)
垃圾回收
测试,重写构造方法,service,init,destroy方法
@Override protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub super.service(arg0, arg1); System.out.println(new Date()+":调用service方法------"); } private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public login() { super(); System.out.println(new Date()+":创建了Servlet对象------"); } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // System.out.println(new Date()+":处理get请求------"); // System.out.println("实例地址为:"+this+";hashCode:"+this.hashCode()); // System.out.println("当前线程:"+Thread.currentThread()); } @Override public void destroy() { // TODO Auto-generated method stub super.destroy(); System.out.println(new Date()+":执行销毁------"); } @Override public void init() throws ServletException { // TODO Auto-generated method stub super.init(); System.out.println(new Date()+":进行初始化操作------"); }
当客户端进行访问时后台输出如下信息:
Sun Jan 14 19:17:46 CST 2018:创建了Servlet对象------ Sun Jan 14 19:17:46 CST 2018:进行初始化操作------ Sun Jan 14 19:17:46 CST 2018:调用service方法------
再次访问时
Sun Jan 14 19:18:14 CST 2018:调用service方法------
关闭服务器后台输出
Sun Jan 14 19:22:26 CST 2018:执行销毁------
相关文章推荐
- Tomcat 3.0版本的一些说明 以及 servlet 生命周期的简单介绍
- (转帖)ServletContext与ServletConfig的简单介绍
- 一张图简单介绍asp。net的页面生命周期
- Android静态变量的生命周期 简单介绍
- Android静态变量的生命周期 简单介绍
- Servlet第六篇【Session介绍、API、生命周期、应用】
- HTTP服务端接口模拟工具-HttpServerMockTool 1 工具功能介绍 这个工具可以通过简单的配置达到快速模拟第三方HTTP服务端接口的作用,替代以前要手写servlet代码再放到to
- J2EE的13个规范之(三) Servlet简单介绍
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- servlet生命周期的简单描述
- Servlet中Filter的简单介绍
- Servlet 简单介绍!
- Maven的生命周期(Lyfecycle)的简单介绍
- Java Web笔记 – Servlet技术介绍 生命周期 核心API 类方法调用顺序
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- servlet简单介绍
- SpringMvc和servlet简单对比介绍
- Servlet第一篇【介绍Servlet、HTTP协议、WEB目录结构、编写入门Servlet程序、Servlet生命周期】
- Android静态变量的生命周期 简单介绍
- java对cookie的操作比较简单,主要介绍下建立cookie和读取cookie,以及如何设定cookie的生命周期和cookie的路径问题。