一: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内部接收请求的代码:
请求转发与重定向的区别
- 请求转发是服务器行为、重定向是客户端浏览器行为
- 请求转发是request对象调用方法、重定向是response对象调用方法
- 请求转发只有一次请求所以可以实现request域对象中的数据共享,而重定向是多次请求、多次响应
- 请求转发的效率要高于重定向
- 请求转发url地址栏不变,而重定向会发生变化
- 既然请求转发是服务器内部的行为,所以只能访问服务器内部资源!而重定向既然是浏览器行为,地址栏会变,所以可以访问服务器外部资源!
总结:
如果我们在跳转路径时,还涉及到数据的传递,用请求转发,因为是一次请求!如果说我们只需要跳转路径,不涉及到任何的数据传递,建议使用重定向,因为url地址栏会发生变化!