JavaWeb学习之HttpServletRequest

HttpServletRequest

在创建Servlet时会重写service()方法,或doGet()/doPost(),这些方法都有两个参数,一个是代表请求的request。一个是代表响应的response。

service方法中的request的类型是ServletRequest,而doGet/doPost方法中的request是HttpServletRequest,HttpServletRequest是ServletRequest的子接口。

request的运行流程

通过抓包工具抓取Http请求

由于request是代表请求,所以可以通过该对象分别获取Http请求的请求行,请求头,请求体。

通过request获得请求行

获取客户端的请求方式:String  getMethod()

获得请求的资源:String   getRequestURI()

                            StringBuffer  getRequestURL()  ---主机号+端口号

                            String  getContextPath()  ---web应用的名称

                            String  getQueryString()   ---get提交url地址后的参数字符串

                                   如:username=zhangsan&password=123

request获得客户端的一些信息

 request.getRemoteAddr()   ---获得访问的客户端的IP地址

package com.oracle.demo01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LineServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取请求方式
		String method = request.getMethod();
		System.out.println("请求方式:" + method);
		/// 获得请求资源的相关内容
		String requestURI = request.getRequestURI();//抓到什么就是什么
		StringBuffer requestURL = request.getRequestURL();// 加上主机号和端口号
		System.out.println(requestURI);
		System.out.println(requestURL);

		// 获取web应用的名称
		String contextPath = request.getContextPath();
		System.out.println("web应用的名称:" + contextPath);
		// 获取get方式提交的参数
		String param = request.getQueryString();
		System.out.println(param);
		// 获取客户端的IP地址
		String ip = request.getRemoteAddr();
		System.out.println("IP地址为:" + ip);
	}

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

运行结果如下:

通过request获得请求头

long  getDateHeader(String name)

String  getHeader(String name)   --获取指定的头

Enumeration  getHeaderNames()   --获取所有的头

Enumeration  getHeaders(String name)

int  getIntHeader(String name)

package com.oracle.demo01;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HeaderServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取指定的头
		String header = request.getHeader("User-Agent");
		// 获得所有头的名称
		Enumeration<String> headerName = request.getHeaderNames();
		while (headerName.hasMoreElements()) {
			String headername = headerName.nextElement();
			String headervalue = request.getHeader(headername);
			System.out.println(headername + ":" + headervalue);
		}
	}

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

运行结果如下:

referer头的作用:执行该此访问的来源做防盗链

package com.oracle.demo01;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RefererServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 对请求的来源进行判断
		String header = request.getHeader("referer");
		if (header != null && header.startsWith("http://localhost:8080")) {
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter().write("马克思主义");
		} else {
			response.getWriter().write("无耻之徒");
		}
	}

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

通过request获得请求体

请求体中的内容是通过post提交的请求参数,格式是:

username=zhangsan&password=123&hobby=football&hobby=basketball

key----------------value

username          [zhangsan]

password           [123]

hobby                 [football,basketball]

获取请求的一些参数:

String getParameter(String name)

String[] getParameterValues(String name)

Enumeration  getParameterNames()

Map<String,String[]> getParameterMap()

注:如果是get请求方式请求参数,上述方法通过适用。

解决post提交方式的乱码问题:request.setCharacerEncoding("UTF-8");   该方式只用于post方式

解决get提交方式的乱码问题:parameter =new String(parameter.getbytes("iso8859-1"),"utf-8");  该方式既可以用于get,也可以用于post

package com.oracle.demo01;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class RegisterServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取表单中的值
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		System.out.println(username + ":" + password);
		System.out.println("!!!!!!!!!!!!!!!!!!!!!!");
		// 通过数组获取指定name值
		String[] sex = request.getParameterValues("sex");
		for (String str : sex) {
			System.out.println(str);
		}
		System.out.println("*******************");
		// 通过map获得所有的值
		Map<String, String[]> map = request.getParameterMap();
		for (Map.Entry<String, String[]> entry : map.entrySet()) {
			// 获得对应的name值
			System.out.println(entry.getKey());
			//获得value值
			for (String str1 : entry.getValue()) {
				System.out.println(str1);
			}
			System.out.println("---------------");
		}
	}

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

request是一个域对象

request对象也是一个存储数据的区域对象,同response一样,也具有如下方法:

setAttribute(String name,Object obj)

getAttribute(String name)

removeAttribute(String name)

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

request完成请求转发

获得请求转发器----path是转发的地址

RequestDispatcher  getRequestDispatcher(String path)

通过转发器对象转发

requestDispatcher.forward(ServletRequest  request,ServletResponse  response)

package com.oracle.demo02;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet01 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//将请求转发给servlet02
		RequestDispatcher dispatcher=request.getRequestDispatcher("/Servlet02");
		//向request中存储数据
		request.setAttribute("name", "zhangsan");
		//执行转发的方法
		dispatcher.forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
} 
package com.oracle.demo02;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Servlet02 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String value = (String) request.getAttribute("name");
		response.getWriter().write("hello lzz..." + value);
	}

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

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

    ServletContext:创建:服务器启动

                               销毁:服务器关闭

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

           Request:创建:访问时创建request

                            销毁:响应结束request销毁

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

注:请求转发与重定向的区别

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

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

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

注:客户端地址与服务器端地址的写法

    客户端地址:是客户端去访问服务器的地址,服务器外部的地址,特点:写上web应用的名称

    重定向 

    服务器端地址:服务器内部资源的跳转地址,特点:不需要写web应用的名称

    转发

 案例:做一个登陆注册功能

package com.oracle.demo03;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class DButil {
	private DButil() {
	}

	public static Connection getConn() {
		try {
			InputStream in = DButil.class.getClassLoader().getResourceAsStream("db.properties");
			Properties pro = new Properties();
			pro.load(in);
			String url = pro.getProperty("url");
			String username = pro.getProperty("username");
			String password = pro.getProperty("password");
			String driver = pro.getProperty("driver");
			Class.forName(driver);
			// 获得连接
			Connection conn = DriverManager.getConnection(url, username, password);
			return conn;
		} catch (Exception ex) {
			throw new RuntimeException(ex + "数据库连接失败");
		}
	}

	public static void close(Statement sta, Connection conn) {
		if (sta != null) {
			try {
				sta.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException ex) {
			}
		}
	}

	public static void close(ResultSet rs, Statement sta, Connection conn) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException ex) {
			}
		}
		close(sta, conn);
	}

}
db.properties配置文件文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?characterEncoding=utf-8
username=root
password=123456
package com.oracle.demo03;

public class Users {
	private String uid;
	private String username;
	private String password;
	private String sex;
	private String hobby;
	
	@Override
	public String toString() {
		return "Users [uid=" + uid + ", username=" + username + ", password=" + password + ", sex=" + sex + ", hobby="
				+ hobby + "]";
	}
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	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;
	}
	
}

 

package com.oracle.demo03;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
	@Override
	public void init() throws ServletException {
		int count = 0;
		ServletContext context = getServletContext();
		context.setAttribute("count", count);
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1、获取用户名和密码
		String user = request.getParameter("username");
		String pwd = request.getParameter("password");
		System.out.println(user + "..." + pwd);
		// 2、从数据库验证用户名和密码是否正确
		try {
			Connection conn = DButil.getConn();
			String sql = "select * from users where username=?and pwd=?";
			PreparedStatement pst = conn.prepareStatement(sql);
			pst.setString(1, user);
			pst.setString(2, pwd);
			ResultSet rs = pst.executeQuery();
			if (rs.next()) {
				ServletContext context = getServletContext();
				Integer count = (Integer) context.getAttribute("count");
				count++;
				System.out.println(rs.getInt("id") + " " + rs.getString("username") + " " + rs.getString("pwd"));
				response.getWriter().write(rs.getInt("id") + " " + rs.getString("username") + " " + rs.getString("pwd")
						+ "you are success login person" + " " + count);
				context.setAttribute("count", count);
			} else {
				request.setAttribute("loginInfo", "用户名密码或错误");
				request.getRequestDispatcher("/login.jsp").forward(request, response);
			}
			DButil.close(rs, pst, conn);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

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

 

package com.oracle.demo03;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;
import java.util.UUID;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

public class RegisteServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 1、获取数据
		Map<String, String[]> properties = request.getParameterMap();
		Users user = new Users();
		// 2、将数据封装到JavaBean
		// 使用BeanUtil进行自动映射封装
		// 工作原理:将map中的数据根据key与实体中的属性的对应关系封装
		// 只要key的名字与实体中的属性名字一样,就自动封装到实体中
		// 需要导两个包
		try {
			BeanUtils.populate(user, properties);
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
        //手动封装一个uid--uuid---随机不重复的字符串32位,但实际的Java代码生成了36位
		user.setUid(UUID.randomUUID().toString());
		System.out.println(user.toString());
		//调用业务方法
		int row=regist(user);
		//跳转登陆页面
		if(row>0){
			response.sendRedirect(request.getContextPath()+"/login.html");
		}else{
			response.getWriter().write("注册失败,请重新注册");
			response.sendRedirect(request.getContextPath()+"/regist.html");

		}
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	public int regist(Users user){
		int row=0;
		Connection conn=DButil.getConn();
		String sql="insert into users values(?,?,?,?,?)";
		try{
			PreparedStatement pst=conn.prepareStatement(sql);
			pst.setString(1, user.getUid());
			pst.setString(2, user.getUsername());
			pst.setString(3, user.getPassword());
			pst.setString(4, user.getSex());
			pst.setString(5, user.getHobby());
            row=pst.executeUpdate();
            DButil.close(pst, conn);
		}catch(SQLException e){
			e.printStackTrace();
		}
		return row;
	}
}

  

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="/web07/RefererServlet">不断汲取马克思主义的科学智慧和理论力量</a>
	<form action="/web07/HeaderServlet" method="post">
		<input type="text" name="username"> 
		<input type="password"name="password">
	    <input type="submit" value="提交">
	</form>
</body>
</html>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/web07/RegisteServlet" method="post">
  用户名: <input type="text" name="username"><br>
    密码:  <input type="password" name="password"><br>
      性别:男<input type="radio" name="sex" value="nan">
      女:<input type="radio" name="sex" value="nv"><br>
      爱好:篮球<input type="checkbox" name="hobby" value="basketballl">
      足球<input type="checkbox" name="hobby" value="footballl">
      排球<input type="checkbox" name="hobby" value="volleyballl"><br>
      <input type="submit"  value="注册">
      <input type="reset"  value="重置">
      
</form>
</body>
</html>

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<div><%=request.getAttribute("loginInfo")%></div>

	<form action="/web07/HeaderServlet" method="post">
		<input type="text" name="username"> <input type="password"
			name="password"> <input type="submit" value="提交">
	</form>
</body>
</html>

  

猜你喜欢

转载自www.cnblogs.com/Java-125/p/9012461.html