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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,220评论 11 349
  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,401评论 0 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,604评论 18 399
  • 一 servlet概述 狭义的Servlet指javax.servlet包中的一个接口,而广义的Servlet则是...
    静慎独阅读 453评论 0 0
  • 本文包括: Servlet简介关于Servlet的一些类 Servlet生命周期 ServletConfig获得初...
    廖少少阅读 3,849评论 1 67