java-web Servlet学习
Servlet接口:
- Servlet主要方法:
init()--ServletConfig
servlet实例化后,容器会先调用init方法,用于初始化对象,即在处理客户需求前完成一些初始化工作。每一个Servlet实例,init只能被调用一次,相当于java的static块。
Servlet使用ServletConfig对象从web应用程序的配置信息中获取以 键值对形式提供的初始化参数。
Servlet使用ServletConfig对象获取ServletContext对象,使用ServletContext可以使Servlet和Servlet容器进行通信。
service()--ServletRequest ServletResponse
容器调用service()方法来处理客户的请求,注意:在service方法前必须确保init方法正确完成。
容器会构造一个请求对象ServletRequest和响应对象ServletResponse作为参数传递给service().
destroy():
当容器检测到Servlet对象从服务中移除的时候会调用该方法。释放资源给GC
getServletConfig()
返回Servletconfig对象
getServletInfo()
返回一个字符串,包含Servlet信息
- Servlet创建的三种方法
一是实现Servlet接口;二是继承抽象类GenericServlet;三是继承HttpServlet类
-- 实现Servlet接口,必须实现Servlet五个方法
public class TestServlet implements Servlet{
public void init(ServletConfig config) throws
ServletException{
System.out.println("init");
}
public ServletConfig getServletConfig(){
return null;
}
public void service(ServletRequest req, ServletResponse res) throws ServletException,IOException{
//这里可以实现请求后要做的内容
PrintWriter out = response.getWriter();
out.println("Hello World!");
}
public String getServletInfo(){
return null;
}
public void destroy(){
System.out.println("destroy");
}
}
--继承抽象类GenericServlet. GenericServlet类中只有一个抽象方法,即service(ServletRequest req, ServletResponse res)
public TestGenericServlet extends GenericServlet{
public abstract void service(ServletRequest req,ServletResponse res)
throws ServletException,IOException{
PrintWriter out = response.getWriter();
out.println("Hello World!");
}
}
--继承HttpServlet类编写Servlet应该是最容易的,而且是最常见的,我们一般要编写Servlet直接继承这个类就行了,重写doGet()或者doPost()方法即可
public TestHttpServlet extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
response.setContentType("text/html;charset = gb2312");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>HelloWorld</title>");
out.println("</head>");
out.println("<body bgcolor = \"white\">");
out.println(“<hr>”);
out.println("HelloWorld");
out.println("</body></html>");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException{
doGet(request, response);
}
}
HttpServlet详解
HttpServletRequest,HttpServletResponse详解
HttpServletRequest:String getContextPath()返回请求URL中表示上下文的部分,如:/simple/test返回/simple
Cookie[] getCookies()返回本次请求所有的Cookie对象
String getHeader()返回请求报头的值
String getMethod()返回本次请求使用的HTTP方法的名字,如post get Trace等
String getPathInfo()返回额外url信息,如/simple/test 返回test
String getPathTranslated()返回真实路径信息 如
String getQueryString()返回请求的action 名称 如
返回 logon
HttpSession getSession()返回和此次请求相关联的session
HttpServletResponse:void addCookie(Cookie cookie)新增一个cookie到响应中去,可以设置多个。
addheader(String name,String value)用给出的name and value增加一个响应报头到响应中去
sendRedirect(String location)发送一个临时的重定向到客户端,让客户端访问的url重新定位
ServletConfig
servlet容器使用ServletConfig对象在容器初始 化的时候向其传递配置信息四种主要方法:
String getInitParameter(String name)返回名字为name的初始化参数的值,初始化参数在配置文件web.xml中配置
Enumeration getInitParameterNames()返回Servlet所有初始化参数名字的枚举集合
ServletContext getServletContext()返回Servlet上下文对象的引用
String getServletName()返回当前Servlet的名称
Servlet配置
web.xml:web应用程序的配置和部署都是通过web.xml来完成的,其包含以下信息
ServletContext 的初始化参数
Session 的配置
Servlet/Jsp的定义
MIME类型映射
欢迎文件列表
错误页面
安全
地区和编码映射
JSP配置
post和get方式
消息报头
Servlet生命周期
Servlet上下文
运行在java虚拟机中的每一个web程序都有一个与之相关的Servlet上下文,java servlet API提供了一个servletContext接口来表示上下文。
一个ServletContext对象表示了一个Web程序的上下文,Servlet容器在初始实例期间,向其传递servletConfig对象,通过其getServletContext()获取上下文。
上下文例子:统计页面访问量:注意这里的上下文必须放在安全锁里
public class CountDemo extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException,IOException{
ServletContext context = getServletContext();
//Enumeration<String>count = context.getAttributeNames();
Integer count = null;
synchronized(context){
count = (Integer)context.getAttribute("counter");
if(null == count){
count = new Integer(1);
}else{
count = new Integer(count.inValue()+1);
}
context.setAttribute("counter", count);
}
res.setContentType("text/html;charset=gb2312");
PrintWriter pw = res.getWriter();pw.println("<html><head>");
pw.println("<title>页面访问统计</title>");
pw.println("</head><body>");
pw.println("该页面已经被访问了 :"+"<b>"+count+"</b>"+" 次");
pw.println("</body></html>");
pw.close();
}
}
Servlet请求转发
好处:
- 提供了统一的访问方式
- 控制器(controller)可以将不同的请求发送给不同的Servlet来进行处理,本身不处理请求,缩短了响应时间
RequestDispacher:servlet控制器
RequestDispacher对象由Servlet来创建,用于封装一个由路径所标识的服务器资源。主要有以下两种方法:
- forward(ServletRequest req, ServletResponse res):
该方法用于将请求从一个Servlet传递给服务器上的另外的Servlet jsp页面,或者HTML文件
注意:这个方法必须在响应被提交给客户端之前使用,之后的话会爆出IllegastateException错误,在forward()调用后原先在响应缓存中未被提交的内容将会自动清除。 - include(ServletRequest req, ServletResponse res)该方法用于响应中包含其他的资源信息(servlet jsp html)等内容。
这两个方法的区别是:include将请求转发给其他对象后,被调用的Servlet做出的响应将并入原来的响应对象中,原来的Servlet对象还可以继续输出响应数据。
forward将请求转发给其他对象后,将由被调用的Servlet对象做出响应,原来的Servlet执行将终止。
- RequestDispache对象的获取
三种方法
--ServletRequest.getRequestDispacher(String path)--资源路径名
--ServletContext.getNamedDispacher(String name)--jsp或servlet名称
--ServletContext.getRequestDispacher(String path)--这里路径必须从/开头 相对于当前上下文根的路径 如/MyServlet
请求转发的实例
package com.tide.servlet;import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
public class Login extends HttpServlet {
public void doPost(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException{
res.setContentType("text/html;charset=GB2312");
ServletContext context = getServletContext();
String name = req.getParameter("user");
String pass = req.getParameter("passwd");
System.out.println("获取到的用户名为 :"+name+" --密码为 :"+pass);
if(StringUtils.isBlank(name) || StringUtils.isBlank(pass)){
System.out.println("用户名或密码为空");
RequestDispatcher dis = context.getRequestDispatcher("/register.jsp");
dis.forward(req, res);
}
else{
RequestDispatcher dis = context.getRequestDispatcher("/loginsuccess.jsp");
dis.forward(req, res);
}
}
}
底层分析:
请求转发(RequestDispatcher)的过程:
客户首先发送一个请求到服务端,服务端发现匹配的Servlet,并指定它去执行,当这个Servlet执行完之后,它要调用getRequestDispatcher()方法,把请求转发给指定的test.jsp,整个流程都是在服务端完成的,而且是在同一个请求里面完成的,因此Servlet和jsp共享的是同一个request,在Servlet里面放的所有东西,在jsp中都能取出来,因此,jsp能把结果getAttribute()出来,getAttribute()出来后执行完把结果返回客户端。整个过程是一个请求,一个响应。
重定向(sendRedirect)的工作原理
客户发送一个请求到服务器,服务器匹配Servlet,这都和请求转发一样,Servlet处理完之后调用了sendRedirect()这个方法,这个方法是response的方法,所以,当这个Servlet处理完之后,看到response.sendRedirect()方法,立即向客户端返回这个响应,响应行告诉客户端受到这个请求后,立刻发出一个新的请求,去请求test.jsp,这里两个请求,这个两个请求互不干扰,相互独立,子啊前面request里面setAttribute()的任何东西,在后面的request里面都获得不了。可见,在sendRedirect()里面是两个请求,两个响应。