Servlet多线程问题
前面我们讲了,一个servlet在服务器中只会存在一个实例,不论是有多少访问,都掉用的同一个实例,也就是单实例多线程的.这就存在着一定的线程安全问题,比如说,我在servlet中定义了一个全局变量,那么这个变量的值很有可能不是我期待的值,所以,在servlet中要尽量避免使用全局变量.
Servlet中重要的对象
在servlet中共有四个重要的对象:
HttpServletRequest 请求对象:获取请求信息
HttpServletResponse 响应对象: 设置响应对象
ServletConfig对象 servlet配置对象
ServletContext对象 servlet的上下文对象
ServletConfig对象
- 创建时间:在创建完servlet对象的时候,接着创建servletConfig对象.
- 如何得到对象:直接使用
ServletConfig config = this.getServletConfig();
- 简单使用
这是web.xml的配置文件
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>cn.roobtyan.LoginServlet</servlet-class>
<!-- 初始参数: 这些参数会在加载web应用的时候,封装到ServletConfig对象中 -->
<init-param>
<param-name>location</param-name>
<param-value>doom</param-value>
</init-param>
</servlet>
配置文件中的init-param
就是配置信息
这个ServletConfig对象共有如下的方法
java.lang.String getInitParameter(java.lang.String name) 根据参数名获取参数值
java.util.Enumeration getInitParameterNames() 获取所有参数
ServletContext getServletContext() 得到servlet上下文对象
java.lang.String getServletName() 得到servlet的名称
ServletContext对象
创建时间:加载web应用时创建ServletContext对象
得到对象:从ServletConfig对象的getServletContext方法得到
这个对象又几个比较重要的方法,我们来介绍一下.
作用:在一个web项目中共享数据,管理web项目资源,为整个web配置公共信息等
java.lang.String getContextPath() --得到当前web应用的路径
java.lang.String getInitParameter(java.lang.String name) --得到web应用的初始化参数
java.util.Enumeration getInitParameterNames()
void setAttribute(java.lang.String name, java.lang.Object object) --域对象有关的方法
java.lang.Object getAttribute(java.lang.String name)
void removeAttribute(java.lang.String name)
RequestDispatcher getRequestDispatcher(java.lang.String path) --转发(类似于重定向)
java.lang.String getRealPath(java.lang.String path) --得到web应用的资源文件
java.io.InputStream getResourceAsStream(java.lang.String path)
转发
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/welcome.jsp");
requestDispatcher.forward(request,response);
这个就是转发,按照这样用就可以了
重定向
与转发功能相似的是重定向,重定向的使用是这样的:
response.sendRedirect("/welcome.jsp");
这样也会访问到welcome.jsp这个页面.
转发和重定向的区别
虽然二者最终实现的功能是相同的.但是还是有很大不同的.不同之处如下
地址栏变化
转发不会改变地址栏中的URL,而重定向则会改变
跳转范围
转发只能访问到当前web应用中的内容,而重定向则可以访问到任意web应用中的内容
request对象作用范围
转发后,在转发后的页面中仍然可以使用原来的request对象,而重定向,原来的request对象则失去作用.