Servlet高级:ServletConfig配置对象,ServletContext全局管理者,域对象,请求转发与重定向

一:ServletConfig配置对象

ServletConfig对象的作用:

主要用于获取配置在Servlet内的初始化参数(配置的数据)

总结:

ServletConfig是Servlet的配置对象,与Servlet是一对一的关系,只能获取到当前Servlet初始化的参数,不能获取到其他Servlet中的初始化参数。

案例:

html部分:

<h3>Servlet登录</h3>
<a href="login">测试单个servletConfig</a>

web.xml部分:

<servlet>
  <servlet-name>LoginServlet</servlet-name>
  <servlet-class>com.offcn.servlet.LoginServlet</servlet-class>
  <init-param>
  <param-name>maxOnline</param-name>
  <param-value>2000</param-value>
  </init-param>
  <init-param>
  <param-name>username</param-name>
  <param-value>蓝湛</param-value>
  </init-param>
  </servlet>
  <servlet-mapping>
  <servlet-name>LoginServlet</servlet-name>
  <url-pattern>/login</url-pattern>
  </servlet-mapping>

servlet部分:

public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取servletConfig对象,此对象与servlet对象是一对一的关系
		ServletConfig servletConfig = this.getServletConfig();
		/*
		 * 使用ServletConfig对象获取配置再Servlet中的初始化参数
		 * getInitParameter("初始化参数名称")==>String初始化参数的值
		 * getInitParameterNames()==>所有参数名所在的集合
		 */
		String iParameter = servletConfig.getInitParameter("maxOnline");
		System.out.println(iParameter);

		Enumeration<String> initParameterNames = servletConfig.getInitParameterNames();
		while (initParameterNames.hasMoreElements()) {
			String string = (String) initParameterNames.nextElement();
			System.out.println(string + ":" + servletConfig.getInitParameter(string));
		}
	}

}

 

 

二:ServletContext全局管理者

总结:

1.ServletContext与Servlet是一对多的关系,所以配置在全局中的参数可以被多个Servlet共享。

2.ServletContext只能获取全局参数,获取不到配置在Servlet内部的参数

3.ServletConfig只能获取到配置在Servlet内部的参数,获取不到全局参数。

 

html部分:

<h3>ServletContext全局管理者对象</h3>
<a href="global">ServletContext全局管理者对象</a>

web.xml部分:

 <servlet>
  <servlet-name>GlobalServlet</servlet-name>
  <servlet-class>com.offcn.servlet.GlobalServlet</servlet-class>
  </servlet>
  <!-- 全局的配置不能在Servlet注册之内,要在Servlet外面 -->
  <context-param>
  <param-name>page</param-name>
  <param-value>10</param-value>
  </context-param>
  <context-param>
  <param-name>uname</param-name>
  <param-value>蓝花花</param-value>
  </context-param>
  
  <servlet-mapping>
  <servlet-name>GlobalServlet</servlet-name>
  <url-pattern>/global</url-pattern>
  </servlet-mapping>
  

servlet部分:

public class GlobalServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 获取ServletContext全局管理者对象
		ServletContext servletContext = this.getServletContext();
		String initParameter = servletContext.getInitParameter("page");
		System.out.println(initParameter);
		/*
		 * 使用ServletContext对象获取全局参数 getInitParameter("初始化参数名称")==>String初始化参数的值
		 * getInitParameterNames()==>所有参数名所在的集合
		 */
		Enumeration<String> initParameterNames = servletContext.getInitParameterNames();
		while (initParameterNames.hasMoreElements()) {
			String string = initParameterNames.nextElement();
			System.out.println(string + ":" + servletContext.getInitParameter(string));
		}

	}

}

 

三:域对象

1:什么是域对象?

存在作用域的对象称为域对象,它的地位在后台开发中很重要,因为数据可以在其作用域范围内实现数据共享,传递。

域对象可以存储数据,获取数据。

2:域对象中对数据进行操作的方法

setAttribute("数据关键字",Object类型的值)

              如果数据关键字在域对象中不存在,则为赋值,添加值。

              如果数据关键字已经存在,则为修改值。

getAttribute("数据关键字")

              通过关键字获取对应的值

removeAttribute("数据关键字")

              通过关键字删除值

3:Servlet要掌握的主要域对象(后期会添加)

   request请求对象

   ServletContext全局管理者

区别:

request请求对象:

当请求到达Servlet时创建。

请求结束,响应完成时销毁。

作用范围仅限本次请求。(仅限一次请求内部)

 

ServletContext全局管理者:

发布项目,tomcat启动加载项目时创建。

服务器关闭时销毁。

作用范围整个web项目的运行期间

 

4:域对象的测试案例

(1)测试request域对象操作数据:

html部分:

<h3>RequestScopeServlet请求域对象</h3>
<a href="request">RequestScopeServlet请求域对象</a>

web.xml部分:-----使用了注释,和servlet写到了一起

servlet部分:

@WebServlet("/request")
public class RequestScopeServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//往request域对象中添加数据
		request.setAttribute("uname", "蓝湛");
		//获取request域对象中的数据
		System.out.println(request.getAttribute("uname"));
		//修改request域对象中的数据
		request.setAttribute("uname", "蓝忘机");
		System.out.println(request.getAttribute("uname"));
		//删除request域对象中的数据
		request.removeAttribute("uname");
		System.out.println(request.getAttribute("uname"));
	}

}

(2)测试ServletContext域对象操作数据:

html部分:

<h3>ContextScopeServlet全局管理者域对象</h3>
<a href="qcs">ContextScopeServlet全局管理者域对象</a>

servlet部分:

@WebServlet("/qcs")
public class ContextScopeServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		  //获取servletContext对象
		  ServletContext servletContext = this.getServletContext();
		  //往servletContext域对象中添加数据
	      servletContext.setAttribute("uname","花城");
	      //获取servletContext域对象中的数据
	      System.out.println(servletContext.getAttribute("uname"));
	      //修改servletContext域对象中的数据
	      servletContext.setAttribute("uname","三郎");
	      System.out.println(servletContext.getAttribute("uname"));
	      //删除servletContext域对象中的数据
	      servletContext.removeAttribute("uname");
	      System.out.println(servletContext.getAttribute("uname"));
	      
	}

}

(3)统计访问人数
  需求:
  每当访问CountServlet时,就需要累加一次访问次数,而且这个访问次数
  还可以被其他Servlet使用
  思路:
  共享数据:访问CountServlet的次数
  域对象:ServletContext域对象

  html部分:

<h3>案例:统计访问人数</h3>
<a href="number">统计访问人数</a>

  servlet部分:
 

@WebServlet("/number")
public class RequestServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//获取ServletContext对象
		ServletContext servletContext = this.getServletContext();
		//获取到之前已经登录的次数
		Integer count = (Integer)servletContext.getAttribute("count");
		/*
		 * count存在两种情况:
		 * 当第一次访问该Servlet时,count为null
		 * 而之后的每一次访问count都有值,就可以执行++操作了
		 */
		if(count==null) {
			servletContext.setAttribute("count", 1);
		}else {
			count++;
			servletContext.setAttribute("count", count);
		}
		System.out.println("当前访问的次数:"+servletContext.getAttribute("count"));
	}

}

四:请求转发与重定向

请求转发的过程,原理:

点击页面中的超链接时,首先发送请求到达ForwardServlet,往request请求对象中存放了数据,执行了请求转发的代码,将请求发送给了ChangeServlet,ChangeServlet内部获取数据可以正常获取,最终在ChangeServlet中完成了对本次请求的响应!整个过程中,只有一次请求、一次响应,所以可以实现数据在request域对象中的共享传递,而且整个过程在服务器内部完成。

重定向的过程,原理:

当点击页面中超链接时,发送请求到RedirectServlet,并且往request域对象中存储了数据,此时执行了重定向的代码,立马针对这次请求做出了响应,并告知客户端浏览器,发送新的请求到指定的路径上,到这为止,第一次请求、响应结束了!然后浏览器立马发送第二次请求到ChangeServlet中,ChangeServlet内部已经拿不到第一次请求中存放的数据了,完成了对第二次请求的响应!

所以整个过程是两个请求、两次响应!

1:请求转发:

在ChangeServlet内部接收到转发的请求:

2.重定向:

在ChangeServlet内部接收请求的代码:

请求转发与重定向的区别

  1. 请求转发是服务器行为、重定向是客户端浏览器行为
  2. 请求转发是request对象调用方法、重定向是response对象调用方法
  3. 请求转发只有一次请求所以可以实现request域对象中的数据共享,而重定向是多次请求、多次响应
  4. 请求转发的效率要高于重定向
  5. 请求转发url地址栏不变,而重定向会发生变化
  6. 既然请求转发是服务器内部的行为,所以只能访问服务器内部资源!而重定向既然是浏览器行为,地址栏会变,所以可以访问服务器外部资源!

总结:

如果我们在跳转路径时,还涉及到数据的传递,用请求转发,因为是一次请求!如果说我们只需要跳转路径,不涉及到任何的数据传递,建议使用重定向,因为url地址栏会发生变化!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值