java-web Servlet学习

2016-02-16  本文已影响286人  cxm11

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接口;二是继承抽象类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请求转发

好处:

RequestDispacher:servlet控制器

RequestDispacher对象由Servlet来创建,用于封装一个由路径所标识的服务器资源。主要有以下两种方法:

这两个方法的区别是:include将请求转发给其他对象后,被调用的Servlet做出的响应将并入原来的响应对象中,原来的Servlet对象还可以继续输出响应数据。
forward将请求转发给其他对象后,将由被调用的Servlet对象做出响应,原来的Servlet执行将终止。

请求转发的实例

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()里面是两个请求,两个响应。

上一篇下一篇

猜你喜欢

热点阅读