您的位置:首页 > 其它

认识Servlet

2015-10-08 15:23 417 查看


认识Servlet
Servlet在第一次被访问的时候,加载,实例化,初始化,之后的每次访问,仅仅做请求的处理
当服务器关闭的时候,会对所有的Servlet进行销毁
在服务器运行的过程中,他只会维护一个Servlet的实例,用这个实例来处理所有用户的请求
每一个用户访问服务器,服务器就会为该用户开辟一个新的线程,也就是说,所有的线程共享同一个Servlet,因此在Servlet里不能去定义类的属性,这样会发生并发错误,如果非要在Servlet中定义属性,需要手动控制线程同步

Servlet的生命周期

1.客户端第一次请求一个Servlet时,web服务器(如tomcat)根据web.xml的配置信息找到此Servlet的类,并创建该Servlet的对象,并根据配置信息创建ServletConfig对象,然后调用Servlet对象的init(ServletConfig)方法进行初始化
2.服务器解析请求信息,创建HttpServletRequest对象,把请求信息封装到HttpServletRequest对象中,然后创建空的HttpServletResponse对象
3.服务器调用Servlet对象的service方法,并把HttpServletRequest对象和HttpServletResponse对象传递给service方法的参数
4.service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等
5.以后再收到此请求时直接调用service方法处理请求

HttpServletResponse与HttpServletRequest的相关方法

1.HttpServletResponse

response.setStatus(i); //设置响应码
response.setHeader(name ,value) //设置响应头
response.setContentType(s); //设置响应内容的mime类型
response.setContentLength(i) //设置响应体长度
response.setCharacterEncoding(s) //设置响应体编码方式
response.getOutputStream() //获得字节输出流,向浏览器发送数据
response.getWriter() //获得字符输出流

2.HttpServletRequest

2.1获取客户端主机信息

request.getRemoteAddr()
request.getRemoteHost()
request.getRemotePort()

2.2获取请求的url相关的信息

request.getScheme()
request.getServerName()
request.getServerPort()
request.getContextPath()
request.getServletPath()
request.getRequestURL()

2.3获取请求行的相关信息

request.getMethod()
request.getRequestURI()
request.getProtocol()
request.getQueryString()

2.4获取请求头信息的相关方法

request.getHeader(headerName);
request.getHeaderNames();
request.getHeaders(headerName)

request.getContentLength();
request.getContentType();

2.5获取请求参数或请求体的相关方法

request.getParameter(name);
request.getParameterMap();
request.getParameterNames();
request.getParameterValues(name)
request.getInputStream();
request.getReader();

Servlet配置信息

在JSP和Servlet中读取web.xml的初始化参数。

一、在Servlet中读取:

在Servlet中一般可以用ServletConfig对象的getInitParameter方法去读取指定的参数的值。举个例子:
新建一个Servlet:GetInitParameter.java
并在web.xml中增加如下配置:
<servlet>
<servlet-name>GetInitParameter</servlet-name>
<servlet-class>com.shc.GetInitParameter</servlet-class>
<init-param>
<param-name>Baidu</param-name>
<param-value>http://www.baidu.com</param-value>
</init-param>
<init-param>
<param-name>Wangyi</param-name>
<param-value>http://www.163.com</param-value>
</init-param>
</servlet>
<servletclass>com.shc.GetInitParameter</servlet-class>是servlet的完整路径,包括包名。
配置好了web.xml,现在可以在程序中读取初始化的参数了。在init(ServletConfig config)方法中传递了一个ServletConfig参数,可以这样获取初始化参数:
public void init(ServletConfig config) throws ServletException
{
super.init(config);
String email = config.getInitParameter("Baidu");
String name = config.getInitParameter("Wangyi");
}
在其他的方法中象doGet(),doPost(),service()方法中可以用getServeltConfig()方法得到一个ServetConfig对象,在利用该对象的getInitParameter()方法取到对应的初始化参数。
String baidu = getServletConfig().getInitParameter("Baidu");
String wangyi= getServletConfig().getInitParameter("Wangyi");

二、在JSP中读取:

在JSP中读取的方式和Servlet中的doGet(),doPost(),Service()
的方法一样,都是由ServletConfig对象来读取的。
<% String baidu = getServletConfig().getInitParameter("Baidu");
String wangyi= getServletConfig().getInitParameter("Wangyi");
%>
但是,在web.xml的配置需要注意一下,新增如下:
<servlet>
<servlet-name>GetInitParam</servlet-name>
<jsp-file>GetInitParam.jsp</jsp-file>
<init-param>
<param-name>Baidu</param-name>
<param-value>http://www.baidu.com</param-value>
</init-param>
<init-param>
<param-name>Wangyi</param-name>
<param-value>http://www.163.com</param-value>
</init-param>
</servlet>
在servlet-mapping中也要配置好:
<servlet-mapping>
<servlet-name>GetInitParam</servlet-name>
<url-pattern>GetInitParam.jsp</url-pattern>
</servlet-mapping>
上面的GetInitParam.jsp出现的标签需要jsp文件的全部路径。

三.在web.xml中配置通用参数

<context-param>
<param-name>context/param</param-name>
<param-value>application param</param-value>
</context-param>
application范围内的参数,存放在servletcontext中,在web.xml中配置如下上。
在servlet里面可以通过getServletContext().getInitParameter("context/param")得到。
init-param属于一个servlet所有,context-param属于整个应用程序所有 ,不仅是在servlet中可以得到,jsp文件中也可以得到.

在jsp中config就相当于这里的servletContext,
<%=config.getServletContext().getInitParameter("...") %>.
action中ServletActionContext.getServletContext().getInitParameter("...").

Servlet响应结果导航

1.使用response.getWriter()方式把响应数据直接发送给浏览器
2.使用response.sendRedirect(url)方式告诉浏览器重新请求url资源(url带上项目路径)
3.使用 请求的转发request.getRequestDispatcher(path).forward(request,response)方式把请求转发到另一个Servlet,让另一个Servlet去进一步处理请求并生成响应(path不带项目路径)

请求转发与重定向的区别

1.从地址栏显示来说
转发(forward)是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
重定向(redirect)是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.所以重定向重定向(redirect)等于客户端向服务器端发出两次request,同时也接受两次response。
转发(forward)只是一次request一次response
2.从效率来说
forward:高.
redirect:低.
3.Forward能够存储request Scope的Attribute而Redirect却不行。
4.Forward需要在Servlet中需要通过一个Dispatcher来实现。
5.Redirect能够防止某些情况下客户端Refresh造成的一些未知后果(例如连续删除)
6.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站
7.传值
在重定向(redirect)方法中传值
1. 通过session传递,前提是同一个服务器
2.拼装带参数的url,直接redirect到新的地址上
转发(forward)方法中传值
1.request.setAttribule("userName",name);//也可以传递对象
2.通过session传递,前提是同一个服务器
3.拼装带参数的url
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: