request学习

request:doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response,其request的类型是HttpServletRequest

,HttpServletRequest是ServletRequest的子接口,功能和方法更加强大。

一、抓取请求的三个部分


、request分别获取三个部分

1)获得请求行和请求行 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//获取请求行
		String method = request.getMethod();//请求方式
		String requestURI = request.getRequestURI();//uri
		StringBuffer requestURL = request.getRequestURL();//url
		String contextPath = request.getContextPath();//常用:web应用的名称
		String queryString = request.getQueryString();//地址后的参数运算符(post请求的不在此处,get请求的在此处)
		String remoteAddr = request.getRemoteAddr();//客户端的ip地址
		
		//获得请求头
		String header = request.getHeader("User-Agent");	//获取响应的值
		Enumeration<String> headerNames = request.getHeaderNames();	//获取所有头的key
		
		System.out.println("请求方式:"+method);
		System.out.println("URI:"+requestURI);
		System.out.println("URL:"+requestURL);
		System.out.println("web应用:"+contextPath);
		System.out.println("参数运算符:"+queryString);
		System.out.println("客户端的ip地址  "+remoteAddr);
		System.out.println();
		
		System.out.println("User-Agent:"+header);
		while(headerNames.hasMoreElements()){		//依次根据每个key输出value值
			String nextElement = headerNames.nextElement();
			System.out.println(nextElement+" :"+request.getHeader(nextElement));
		}
	}
输出结果如下:


2)获得请求体 某个请求参数可能有多个值 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		String username = request.getParameter("username");	//获得请求体中 username的值
		String password = request.getParameter("password");	//获得请求体中 password的值
			
		String[] hobbys = request.getParameterValues("hobby");	//获得请求体中 hobby的值(多个)
		
		Enumeration<String> parameterNames = request.getParameterNames();	//获取请求体每一个的名字
		
		Map<String, String[]> parameterMap = request.getParameterMap();		//常用:获得一个集合 内容为 名字, 值
		
		System.out.println(username+"\n"+password+"\n");
		
		for(String s:hobbys)
			System.out.println(s);
		
		while(parameterNames.hasMoreElements())				//输出每一个的名字
			System.out.println(parameterNames.nextElement());
		
		for(Map.Entry<String,String[]> s:parameterMap.entrySet())	//输出每一对值 
		{
			System.out.println("------------");
			System.out.println(s.getKey());	//输出key
			for(String k:s.getValue())	//输出value 可能有多个 用for循环
				System.out.println(k);
		}
	}
输出结果如下

扫描二维码关注公众号,回复: 2334173 查看本文章



3)request为域对象 可以用来储存数据

setAttribute(String name,Object o)

getAttribute(String name)

removeAttribute(String name)

注意:request域的作用范围:一次请求中

注意:ServletContext域与Request域的生命周期比较?

ServletContext:

创建:服务器启动

销毁:服务器关闭

域的作用范围:整个web应用

request

创建:访问时创建request

销毁:响应结束request销毁

域的作用范围:一次请求中


三、转发

转发的实质


转发和重定向的区别 

1)重定向两次请求,转发一次请求

2)重定向地址栏的地址变化,转发地址不变

3)重新定向可以访问外部网站 转发只能访问内部资源

4)转发的性能优于重定向



转发的实现 跳转到s2 servlet进行处理 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//请求转发
		RequestDispatcher requestDispatcher = request.getRequestDispatcher("/s2");
		//执行
		requestDispatcher.forward(request, response);
	}

四、实现注册系统

1)解决输出中文的时候出现乱码的问题
出现乱码的原因 使用utf-8编码 但使用iso88591解码 出现乱码。 
get提交方式,只能用原始方式解决,此时用iso88591编码后再用utf-8编码即可重新获得中文。
post提交方式,用上诉解决方式或request.setCharacterEncoding("UTF-8");

2)编写html页面如下   post提交
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/web15/register" method="post">	
		用户名:<input type="text"name="username"><br/>
		密码:<input type="password"name="password"><br/>
		邮箱:<input type="email" name="email" ><br/>
		姓名:<input type="text" name="name" ><br/>
		<input type="radio" name="sex" value="man">男
		<input type="radio" name="sex" value="woman">女<br/>
		生日:	<input type="date" name="birthday" ><br/>
		手机:<input type="text" name="telephone" ><br/>
		<input type="submit"value="注册"><br/>
	</form>
</body>
</html>

3)编写servlet如下 
如果表单内容多,需要每个内容都进行 get获取和set到javabean中, 此时导入BeanUtils包,进行自动封装。
public class Register extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		//设置request的编码---只适合post方式
		request.setCharacterEncoding("UTF-8");

		//get方式乱码解决 中文 -- utf8编码 -- iso8859-1解码 --(乱码 )--iso8859-1编码--utf-8解码--中文
		//String username = request.getParameter("username");//乱码
		//先用iso8859-1编码 在使用utf-8解码
		//username = new String(username.getBytes("iso8859-1"),"UTF-8");
		
		
		/*1 获取数据
		request.getParameter("...");
		...
		2 将数据封装到javabean中
		User user = new User();
		user.setUsername(...);
		...*/
		
		/*使用BeanUtils进行自动映射封装
		工作原理:将map中的数据 根据key与实体的属性的对应关系封装
		只要key的名字与实体的属性的名字一样就自动封装到实体中*/
		Map<String, String[]> parameterMap = request.getParameterMap();//请求的内容封装成一个map
		User user = new User();
		try {
			BeanUtils.populate(user, parameterMap);	//map封装到实体中
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		} 
		////3 User对象已经封装 将参数传递给业务操作方法
		try {
			register(user);
		} catch (SQLException e) {
			e.printStackTrace();
		}			
		
		//4 注册完成  重定向到登陆界面 地址改变 1:告知用户 2:防止用户重复刷新
		response.sendRedirect(request.getContextPath()+"/login.html");	//获取应用名称 防止硬编码		
	}

	public void register(User user) throws SQLException{	//数据库操作的方法
		QueryRunner runner = new QueryRunner(C3P0Utils.getDataSource());
		String uid = UUID.randomUUID().toString();
		String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
		Object[] para = {uid,user.getUsername(),user.getPassword(),user.getName(),user.getEmail(),user.getTelephone(),
				user.getBirthday(),user.getSex(),null,null};
		runner.update(sql, para);
	}
	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}









猜你喜欢

转载自blog.csdn.net/cairuojin/article/details/80201660
今日推荐