Web常用对象2

Session

Session的作用

Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。

Session的获取

通过 request.getSession()方法,来获取当前会话的 session 对象。

Session的方法

获取会话标识符、获取创建时间、获取最后一次访问时间、判断是否是新的会话

作为域对象

Session 用来表示一次会话,在一次会话中数据是可以共享的。

通过 setAttribute(name,value);方法向域对象中添加数据

通过getAttribute(name) 从域对象中获取数据

通过 removeAttribute(name)从域对象中移除数据。

// 创建或获取当前会话的 session 对象
HttpSession session = request.getSession();

// 获取会话标识符
String id = session.getId();
System.out.println("获取会话标识符:" + id);		
// 获取创建时间
System.out.println("获取创建时间:" + session.getCreationTime());
// 获取最后一次访问时间、
System.out.println("获取最后一次访问时间:" + session.getLastAccessedTime());
// 判断是否是新的会话
System.out.println("判断是否是新的会话:" + session.isNew());

Session的作用

Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。

Session的获取

通过 request.getSession()方法,来获取当前会话的 session 对象。

Session的方法

获取会话标识符、获取创建时间、获取最后一次访问时间、判断是否是新的会话

作为域对象

Session 用来表示一次会话,在一次会话中数据是可以共享的。
通过 setAttribute(name,value);方法向域对象中添加数据
通过getAttribute(name) 从域对象中获取数据
通过 removeAttribute(name)从域对象中移除数据。

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// 创建或获取当前会话的 session 对象
	HttpSession session = request.getSession();
	// 获取session的ID
	System.out.println("Session02 SessionID : " + session.getId());
	
	
	// 设置session域对象
	session.setAttribute("uname", "zhangsan");
	// 设置request域对象
	request.setAttribute("uname2", "lisi");
	
	
	// 请求转发跳转到Session03
	// request.getRequestDispatcher("Session03").forward(request, response);
	// 重定向
	// response.sendRedirect("Session03");
	
	
	request.getRequestDispatcher("index.jsp").forward(request, response);
	//response.sendRedirect("index.jsp");
	
}

Session的作用

Session 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 创建或获取当前会话的 session 对象
		HttpSession session = request.getSession();
		// 获取session的ID
		System.out.println("Session03 SessionID : " + session.getId());
		
		// 获取session域对象
		String uname = (String) session.getAttribute("uname");
		System.out.println("uname:" + uname);
		// 获取request域对象
		String uname2 = (String)request.getAttribute("uname2");
		System.out.println("uname2:" + uname2);
		
		
	}

Session 的销毁

1、默认到期时间

Tomcat 中 session 默认的存活时间为 30min,即你不操作界面的时间,一旦有操作,session 会重新计时。
可以在Tomcat中的web.xml文件中进行修改。

<session-config>
   <session-timeout>30</session-timeout>
</session-config>

2、自己设定到期时间
设定 session 的生命周期,通过session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,单位为秒。
通过 getMaxInactiveInterval();方法来查看当前 Session 对象的最大不活动时间。

3、销毁session
session.invalidate();

4、关闭浏览器
session的底层是依赖cookie,默认关闭浏览器即失效

5、关闭服务器
非正常关闭服务器
注:如果是正常通过stop关闭服务器,session对象会被钝化到本地磁盘中,等下次访问时会从本地磁盘中活化
当非正常关闭服务器时,session 销毁;当正常关闭服务器时,Session 将被序列化到磁盘上,在工作空间 work 目录下的 SESSION.ser 文件中,下次启动服务时,自动加载到内存。

// 获取session对象
HttpSession session = request.getSession();
// 获取最大不活动时间
int time = session.getMaxInactiveInterval();
System.out.println("获取最大不活动时间:" + time);

// 设置最大不活动时间
session.setMaxInactiveInterval(100);

// 销毁session对象
// session.invalidate();

获取ServletContext对象

1、通过request获取
2、通过session获取
3、通过getServletConfig方法
4、直接获取

常用方法

获取服务器版本信息 getServerInfo()
获取项目在服务器中的路径 getRealPath("/")
作为域对象
通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数据

// 通过request获取
ServletContext servletContext = request.getServletContext();
// 通过session获取
ServletContext servletContext2 = request.getSession().getServletContext();
// 通过getServletConfig方法
ServletContext servletContext3 = getServletConfig().getServletContext();
// 直接获取
ServletContext servletContext4 = getServletContext();

// 获取服务器版本信息
String serverInfo = servletContext.getServerInfo();
System.out.println(serverInfo);

// 获取项目在服务器中的路径
String path = servletContext.getRealPath("/");
System.out.println(path);

文件上传

**前台:**

1、表单提交类型为POST,表单类型设置为enctype=“multipart/form-data”
2、设置表单元素的name属性值

后台:
将commons-io与commons-fileupload的jar包拷贝到项目中WEB-INF的lib目录下
DiskFileItemFactory – 设置磁盘空间,保存临时文件。只是一个工具类
ServletFileUpload – 文件上传的核心类,此类接收 request,并解析
ServletFileUpload.parseRequest(request); – List 解析 request

1、 创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
2、 创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
3、 通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
4、 遍历集合中的各个元素并处理
5、 判断每个元素是否是普通表单项,如果是则按照普通表单项处理
6、 如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 设置请求的编码格式
		request.setCharacterEncoding("UTF-8");
		
		// 获取tomcat下的upload目录的路径
		String path = getServletContext().getRealPath("/upload");
		// 临时文件目录
		String tempPath = getServletContext().getRealPath("/temp");
		
		// 1、声明DiskFileItemFactory工厂类,用于在指定磁盘上设置一个临时目录
		DiskFileItemFactory disk = new DiskFileItemFactory(1024 * 10, new File(tempPath));
		// 2、声明ServletFileUpload,接收上面的临时文件。也可以默认值
		ServletFileUpload up = new ServletFileUpload(disk);
		try {
			// // 3、解析request
			List<FileItem> list = up.parseRequest(request);
			if (list.size() > 0) {
				// 遍历表单项
				for (FileItem file : list)
					// 判断是否是普通的表单项
					if (file.isFormField()) {
						String fieldName = file.getFieldName(); // 表单元素的name属性值
						// 中文乱码,此时还需要指定获取数据的编码方式
						// String value = file.getString();
						String value = file.getString("UTF-8"); // 文本框的值
						System.out.println(fieldName + "=" + value);
					} else { // 说明是一个文件
						// 获取文件本身的名称
						String fileName = file.getName(); // 获取上传的文件名
						System.out.println(file.getFieldName());
						// 处理文件名称  (截取\\等符号)
						fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
						System.out.println("old Name : " + fileName);
						// 修改名称  (得到文件的后缀名)
						String extName = fileName.substring(fileName.lastIndexOf("."));
						// 生成随机字符,拼接文件后缀,拼接成新的文件名
						String newName = UUID.randomUUID().toString().replace("-", "") + extName;
						// 保存新的名称,并写出到新文件中
						file.write(new File(path + "/" + newName));
						System.out.println("文件名是:" + fileName);
						System.out.println("文件大小是:" + file.getSize());
						file.delete(); // 删除临时文件
					}
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

文件下载

Step1:需要通过 HttpServletResponse.setContentType 方法设置 Content-type 头字段的值, 为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型,例 如 ”application/octet-stream” 或 ”application/x-msdownload” 等

Step2:需要通过 HttpServletResponse.setHeader 方法设置 Content-Disposition 头的值 为”attachment;filename=文件名”

Step3: 读取下载文件,调用HttpServletResponse.getOutputStream方法返回的OutputStream对象来向客户端写入附件内容。

// 设置请求的编码格式
		request.setCharacterEncoding("UTF-8");
		// 得到要下载的文件名
		String fileName = request.getParameter("fileName");
		// 得到文件的存放路径 (项目存放在服务器中的路径)
		String realPath = request.getServletContext().getRealPath("/upload/");
		// 文件路径
		String filePath = realPath + fileName;
		// 通过路径得到file对象
		File file = new File(filePath);
		// 判断文件是否存在
		if (file.exists()) {
			// 为浏览器无法使用某种方式或激活某个程序来处理的 MIME 类型
			response.setContentType("application/x-msdownload");
			// 设置 Content-Disposition 头
			response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
			// 得到文件的输入流
			InputStream in = new FileInputStream(file);
			// 得到输出流
			ServletOutputStream out = response.getOutputStream();
			// 输出流
			byte[] bytes = new byte[1024];
			int len = 0;
			while((len = in.read(bytes)) != -1) {
				out.write(bytes, 0, len);
			}
			// 关闭流
			out.close();
			in.close();
		} else {
			System.out.println("文件不存在,请重试!");
		}

Filter

实现流程:
1、创建普通java类
2、实现javax.servlet.Filter的接口,并实现对应的方法
3、配置web.xml

doFilter()
处理请求
chain.doFilter()才能放行资源;
写在前面的是处理请求数据,写在后面是处理响应数据

字符集过滤器

public class EncodeFilter implements Filter {

    
    public EncodeFilter() {
       
    }

	
	public void destroy() {
		
	}

	
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
		
		// 基于HTTP
		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		
		// 处理POST请求乱码
		request.setCharacterEncoding("UTF-8");
		
		// 得到请求方式
		String method = request.getMethod();
		// 判断是否是GET请求
		if ("GET".equalsIgnoreCase(method)) {
			// 得到服务器信息
			String serverInfo = request.getServletContext().getServerInfo();
			// 截取服务器版本信息,得到具体的版本号
			String versionStr = serverInfo.substring(serverInfo.indexOf("/")+1, serverInfo.indexOf("."));
			// 判断是否是Tomcat7及以下版本
			if (Integer.parseInt(versionStr) < 8) {
				// 自定义内部类,处理乱码问题,该类本质也是HttpServletRequest
				MyWapper myRequest  = new MyWapper(request);
				// 放行处理好的request对象
				chain.doFilter(myRequest, response);
				return;
			}
		}
		
		chain.doFilter(request, response);
		
		
	}

	
	public void init(FilterConfig fConfig) throws ServletException {
		
	}
	
	/**
	 * 自定义内部类,继承HttpServletRequestWrapper包装类,重写getParameter()方法,处理乱码问题
	 * @author Lisa Li
	 *
	 */
	class MyWapper extends HttpServletRequestWrapper {

		// 提升变量作用域
		private HttpServletRequest request;
		public MyWapper(HttpServletRequest request) {
			super(request);
			this.request = request;
		}
		
		/**
		 * 重写getParameter()方法,处理乱码问题
		 */
		@Override
	    public String getParameter(String name) {
	        String value = request.getParameter(name);
	        if (value != null) {
	        	try {
					value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
	        }
	        return value;
	    }
		
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值