Java获取表单数据和会话技术

本文详细介绍了如何在Web应用中通过四种方法从HTML表单获取用户输入数据,并展示了如何利用BeanUtils将参数封装成JavaBean对象。此外,还深入探讨了request域对象的使用,包括请求转发、请求重定向和请求包含的概念与实践。文章进一步讲解了会话技术的基础概念,包括Cookie的使用流程、设置及存活时间,以及如何通过Cookie实现记录用户最后一次登录时间的功能。

首先在WebContent创建一个表单

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/sh-web-03/Demo02" method="get">
	账号:<input type="text" name="username"><br/>
	密码:<input type="text" name="password"><br/>
	男:<input type="radio" name="sex" value="男"checked="checked"><br/>
	女:<input type="radio" name="sex" value="女"><br/>
	唱歌:<input type="checkbox" name="hobby" value="唱歌">
	跳舞:<input type="checkbox" name="hobby" value="跳舞">
	画画:<input type="checkbox" name="hobby" value="画画">
	<br/>
	<select name="city">
		<option>--请选择--</option>
		<option value="sh">上海</option>
		<option value="bj">北京</option>
		<option value="gz">广州</option>
	</select>
	<br/>
		<input type="submit" value="提交">
	</form>
</body>
</html>

从表单中获取数据(4种方法)
方法一


		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		// 获取多个值
		String[] hobby = request.getParameterValues("hobby");
		String city = request.getParameter("city");
		System.out.println(username);
		System.out.println(password);
		System.out.println(sex);
		for (String string : hobby) {
			System.out.println(string);
		}
		System.out.println(city);
	

方法二


		// 获取参数的所有name
		Enumeration<String> names = request.getParameterNames();
		while (names.hasMoreElements()) {
			String nextElement = names.nextElement();
			System.out.println(nextElement);
		}
	

方法三


		// 获取参数的map集合
		Map<String, String[]> map = request.getParameterMap();
		for (String key : map.keySet()) {
			String[] values = map.get(key);
			for (String value : values) {
				System.out.println(key + "=" + value);
			}
		}
	

方法四(重点)
利用BeanUitls直接将请求的参数封装成一个对象
参数1:创建新对象,传进去哪个就封装进哪个对象
参数2:从请求中获取的参数的map集合
注意:
1.使用的实体类对象 必须符合JavaBean规范
2.实体类的成员变量 要跟 获取的参数一样
3.实体类的成员变量名 和 name标签名要相同
首先导入commons-beanutils-1.9.3.jar和commons-logging-1.2.jar
先创建一个类

package com.lanou3g;

import java.util.Arrays;

/*
 * 建议:实体类中的成员变量名 
 * 和 表单中的name标签
 * 和 数据库中表的字段 名字用一样的
 */
public class User {
	private String username;
	private String password;
	private String sex;
	private String[] hobby;
	private String city;
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public User(String username, String password, String sex, String[] hobby, String city) {
		super();
		this.username = username;
		this.password = password;
		this.sex = sex;
		this.hobby = hobby;
		this.city = city;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String[] getHobby() {
		return hobby;
	}
	public void setHobby(String[] hobby) {
		this.hobby = hobby;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + ", sex=" + sex + ", hobby="
				+ Arrays.toString(hobby) + ", city=" + city + "]";
	}	
}

封装进对象

		// 将获取的参数 封装成一个对象
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String sex = request.getParameter("sex");
		// 获取多个值
		String[] hobby = request.getParameterValues("hobby");
		String city = request.getParameter("city");
		// 放入对象中
		User user = new User(username,password,sex,hobby,city);
		System.out.println(user);

获取数据

		User user = new User();
		try {
			BeanUtils.populate(user, request.getParameterMap());
			System.out.println(user);
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	
Request域对象

先创建Demo04类

public class Demo04 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		// 响应回浏览器
		response.getWriter().write("456");
		// 取出request域中的值
		Object attribute = request.getAttribute("wanglong");
		System.out.println(attribute);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}
}

测试域对象的使用范围


		// 测试域对象的使用范围
		// 请求转发(一次请求)
		// 注意:最终响应回浏览器的内容是 转发到的页面的响应
		// 在request域中保存值
		request.setAttribute("wanglong", "nan");
		// 使用request对象 进行请求转发
		// 获取请求转发器
		RequestDispatcher dispatcher = request.getRequestDispatcher("/Demo04");
		dispatcher.forward(request, response);
	

测试请求重定向(两次请求 超出request的范围)

response.sendRedirect("/sh-web-03/Demo04");

请求包含(一次请求 并且两个页面的响应都会返回给浏览器)


		response.setContentType("text/html;charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		// 获取字符流
		PrintWriter writer = response.getWriter();
		request.setAttribute("wanglong", "nan");

		// 请求包含(一次请求 并且两个页面的响应都会返回给浏览器)
		// 获取转发器
		RequestDispatcher dispatcher = request.getRequestDispatcher("/Demo04");
		// 包含方法
		dispatcher.include(request, response);
		
		// 响应回浏览器
		writer.write("123");
		System.out.println("我是Demo03");
	
会话技术

定义 : 指的是客户端(用户/浏览器)和服务端(Servlet)进行的交互
基础概念
一次会话 : 当关闭浏览器时,这次会话才会结束

  • 客户端技术(浏览器实现)Cookie , cookie的使用流程:
    1.当用户第一次访问服务器时,服务器可以创建一个cookie出来并且 添加到响应中 响应回浏览器(用户)
    2.当浏览器 接收到 携带了cookie的响应后,会将cookie保存到本地文件
    3.当用户 再一次访问服务器时,会携带着cookie一起去访问,这时服务端拿到cookie可以使用
    4.默认当浏览器关闭 会话结束 浏览器销毁保存cookie (可以设置cookie存活时间 当时间到了 才会销毁)
  • Cookie的使用
    1.每个网站最多可以保存20个cookie到浏览器中
    2.每个cookie最多4kb(只能保存小数据)
    3.每个浏览器最多可以保存300个cookie
    4.cookie中不能保存中文
  • 设置Cookie存活时间 , setMaxAge 以秒为单位
  1. 正值 : cookie到时间被销毁
  2. 负值 : 浏览器不会保存cookie 会话结束 直接销毁cookie
  3. 0值 : 立即删除cookie

cookie的流程图
在这里插入图片描述

使用上面所学实现一个需求:显示上一次(最后)的登录时间

public class Demo05 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		request.setCharacterEncoding("UTF-8");
		
		// 从请求中获取cookie
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (Cookie cookie : cookies) {
				// 找出刚才保存叫lastTime的cookie
				if (cookie.getName().equals("lastTime")) {
					// 获取cookie保存的值
					String value = cookie.getValue();
					// 字符串转long型
					long time = Long.parseLong(value);
					// 字符串转成时间
					Date date = new Date(time);
					// 将日期对象格式化
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss");
					// 格式化
					String stringTime = sdf.format(date);
					// 将时间显示到浏览器
					response.getWriter().write(stringTime.toString());
				}
			}
		}
		
		// 创建一个cookie
		Cookie cookie = new Cookie("lastTime", System.currentTimeMillis() + "");
		// 设置存活时间
		cookie.setMaxAge(60 * 5);
		// 设置保存路径
		// / 表示工程下所有的servlet类都能拿到这个cookie
		// /sh-web-03/servlet 只有访问路径是servlet下的类才能获取到cookie
		cookie.setPath("/sh-web-03/servlet");
		// 保存到响应中
		response.addCookie(cookie);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值