java用学servlet吗,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("");

out.println("

");

out.println("

HelloWorld");

out.println("");

out.println("

");

out.println(“


”);

out.println("HelloWorld");

out.println("");

}

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();

//Enumerationcount = 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("

");

pw.println("

页面访问统计");

pw.println("

");

pw.println("该页面已经被访问了 :"+""+count+""+" 次");

pw.println("");

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值