您的位置:首页 > 其它

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()方法(判断具体的请求方式,调用对应的方法)
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:执行销毁------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: