zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    ASP.NET实现进度条效果【转】
    删除指定创建日期前的文件夹、文件
    MS SQL SERVER执行大脚本文件时,提示“内存不足”的解决办法
    solr之functionQuery(函数查询)【转】
    解决Jenkins连接git时报错Permission denied (publickey)
    vscode csharp c#开发 自动引入命名空间
    nginx配置后外网无法访问
    jenkins node 版本无法使用最新的版本
    jenkins npm install WARN checkPermissions Missing write access 权限问题
    小程序setData只修改对象中的某个属性的方法
  • 原文地址:https://www.cnblogs.com/Java-125/p/9012461.html
Copyright © 2011-2022 走看看