在javaweb编程中,可以在四个不同大小的可访问范围(时间、空间)中设置属性对象。即将一个对象绑定到一个字符串上。JavaWeb中四大域对象的作用范围
ServletRequest :
作用范围是整个一次请求链(包括将此请求转发到的其它页面),也即从客户端发来一次请求开始,到本次服务端响应结束。
对应内置对象是request,EL中可用requestScope取得此对象。
我们一会将会和session一起举例对比
注意:浏览器发送一次请求到服务器,服务器首先判断,该请求是否携带一个SessionID值
如果这次请求没有携带一个SessionID值,服务器就知道了,这是第一次来访问该服务器
浏览器与该服务器开始建立会话
服务器会在相应请求的同时,将产生一个SessionID,作为该次会话的标识
再把这个SessionID发给浏览器,浏览器就拥有一个SessionID了
当再次访问该服务器时,浏览器会携带那个SessionID,被传到服务器
服务器首先判断该请求是否携带一个SessionID值,此时有了,代表这不是一个新的会话的请求
如果浏览器两个请求之间的时间太长,超出服务器等待的时间,服务器会删除这个session对象
删除后,再次发送到该服务器,因为服务器里没有这个session对象了,就不能判断请求是否携带SessionID值
也就是说判断不出来,就认为这是一个新的会话开始,又会产生一个SessionID,作为这次新会话的标识
又把这个SessionID发给浏览器,浏览器就拥有一个新的SessionID了
在会话开始时,服务器会自动分配一个空间(session对象),SessionID就在session对象里
A . 只要浏览器和服务器没有配对的sessionId就表示session无效。
B . 有的服务器可以做到启动后恢复之前的session。即服务器正常关闭,再启动,Session对象会进行钝化和活化操作。同时如果服务器钝化的时间在session 默认销毁时间之内,则活化后session中的一些对象还是存在的,否则认为已经被释放了。
SessionServlet.Java:
/*这个是SessionServlet类*/
package com.yy.servlet.web.Session;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.junit.Test;
public class SessionServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("UTF-8");
/*接受页面提交来的数据*/
String username=request.getParameter("username");
String userpwd=request.getParameter("userpwd");
/*通过request请求把参数存起来*/
request.setAttribute("username", username);
request.setAttribute("userpwd", userpwd);
/*通过request获得session把请求把参数存起来*/
HttpSession session = request.getSession();
System.out.println(session.getId());
session.setAttribute("session_username", username);
session.setAttribute("session_userpwd", userpwd);
/*转发去其他页面顺便把请求参数带过去*/
request.getRequestDispatcher("/session/session.jsp").forward(request, response);
return;
}
}
这个是login_test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting pagetitle>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<script>
var password=0;
function showName(){ /*判断用户输入的名字是否为空*/
var name=document.getElementById("name").value;
//name=trim(name);
if(name==""){
document.getElementById("nameFont").innerHTML="你输入的名字为空";
}else{
document.getElementById("nameFont").innerHTML="";
}
}
function showPwd(){ /*判断用户输入的密码是否为空*/
var pwd=document.getElementById("pwd").value;
//name=trim(name);
if(pwd==""){
document.getElementById("pwdFont").innerHTML="你输入的密码为空";
}else if(pwd.lenght>8&&pwd.lenght<16){
document.getElementById("pwdFont").innerHTML="密码需要在8-16位";
}else{
document.getElementById("pwdFont").innerHTML="";
}
}
script>
head>
<body>
<center>
<h1 style ="color:red;font-size:60px">用户登录h1>
center>
<hr>hr>
<form action="session" method="get">
<table cellpadding="5">
<tr>
<td><span>NAME:span>td>
<td ><input style="width:200px" type="text" value="youe name" name="username" id="name" onfocus="showName()" onblur="showName()"/>td>
<td id="nameFont">td>
tr>
<td><span>PWD:span>td>
<td><input style="width:200px" type="password" value="888" name="userpwd" id="pwd" onfocus="showPwd()" onblur="showPwd()"/>td>
<td id="pwdFont">td>
tr>
<tr>
<td>
<input type="submit" value="登录" />
td>
<td>
td>
tr>
table>
<hr>hr>
form>
body>
html>
web.xml
<servlet>
<servlet-name>SessionServletservlet-name>
<servlet-class>com.yy.servlet.web.Session.SessionServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>SessionServletservlet-name>
<url-pattern>/sessionurl-pattern>
servlet-mapping>
session.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'session.jsp' starting pagetitle>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
head>
<body>
<h1>repuset作用域测试:h1>
<span>1:姓名:<%=request.getAttribute("username") %>span> <span>密码:<%=request.getAttribute("userpwd") %>span>
<br/>
<span>2:姓名:${username}span> <span>密码:${userpwd}span>
<hr/>
<h1>Session作用域测试:h1>
<span>1:姓名:<%=session.getAttribute("session_username") %>span> <span>密码:<%=session.getAttribute("session_userpwd") %>span>
<br/>
<span>2:姓名:${session_username}span> <span>密码:${session_userpwd}span>
body>
html>
运行结果(服务器上运行):
login_test.jsp —>SessionServlet —>session.jsp , 效果图
现在我们比较下request和 session的作用域:
我们现在直接单独访问session.jsp(http://localhost/ServletForWord/session)
现在我们发现request作用域已经不存在了
/*web.xml配置*/
param>
<param-name>jdbcDriverparam-name>
<param-value>com.mysql.jdbc.Driverparam-value>
param>
/*FirstServlet类*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*获取ServletContext对象*/
ServletContext application=this.getServletContext();
System.out.println(application.getInitParameter("jdbcDriver"));
/*再存在ServletContext对象里面*/
application.setAttribute("jdbc", application.getInitParameter("jdbcDriver"));
}
/*ScecondServlet类*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*获取ServletContext对象*/
ServletContext application=this.getServletContext();
System.out.println(application.getInitParameter("jdbcDriver"));
/*再从ServletContext对象里面取出来*/
System.out.println(application.getAttribute("jdbc"));
}
运行结果:console 都 打印出了 value”com.MySQL.jdbc.Driver”
所以说:ServletContext作用范围是整个Web应用
总结:作用范围从小到大依次为:PageContext,ServletRequest,Session,ServletContext。
filter翻译为过滤器。在web项目中,经常需要在正式处理请求前,做一些特殊的处理或常用的例程,于是就发明了这个filter。
<filter>
<filter-name>FirstFilterfilter-name>
<filter-class>com.yy.servlet.web.filter.FirstFilterfilter-class>
filter>
<filter-mapping>
<filter-name>FirstFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
注意:chain参数则通过调用自己的doFilter方法来将请求向下传递,如果没有调用doFilter()方法,则相当于阻止了本次请求。
创建如下:
/*这个是FirstFilter过滤器类*/
package com.yy.servlet.web.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class FirstFilter implements javax.servlet.Filter{
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filter) throws IOException, ServletException {
/*如果没有调用doFilter()方法,则相当于阻止了本次请求。*/
filter.doFilter(request, response);
System.out.println("filter is ok");
}
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}