request对象和response对象原理
- request对象和response对象是由服务器创建的
- request对象是获取请求的消息,response对象是设置响应的消息
- request对象继承体系结构:
ServletRequest -- 接口 | 继承 HttpServletRequest -- 接口 | 实现 org.apache.catalina.connector.RequestFacade -- 类(tomcat)
request功能:
- 获取数据:
- 获取请求行消息:
- 获取请求方式:
String getMethod()
- 获取虚拟目录:
String getContextPath()
- 获取Servlet路径:
String getServletPath()
- 获取get方式的参数:
String getQueryString()
- 获取请求的URI:
String getRequestURI()
和String getRequestURL()
- 获取协议及版本:
String getProtocol()
- 获取客户机的IP地址:
String getRemoteAddr()
- 获取请求方式:
// http://localhost:8087/day22_2_war_exploded/RequestDemo1?name=zhangsan String method = request.getMethod(); System.out.println(method); // GET String contextPath = request.getContextPath(); System.out.println(contextPath); // /day22_2_war_exploded String servletPath = request.getServletPath(); System.out.println(servletPath); // /RequestDemo1 String queryString = request.getQueryString(); System.out.println(queryString); // name=zhangsan // URI:统一资源标识符 String requestURI = request.getRequestURI(); System.out.println(requestURI); // /day22_2_war_exploded/RequestDemo1 // URL:统一资源定位符 StringBuffer requestURL = request.getRequestURL(); System.out.println(requestURL); // http://localhost:8087/day22_2_war_exploded/RequestDemo1 String protocol = request.getProtocol(); System.out.println(protocol); // HTTP/1.1 String remoteAddr = request.getRemoteAddr(); System.out.println(remoteAddr); // 0:0:0:0:0:0:0:1
- 获取请求头数据:
String getHeader(String name)
:通过请求头的名称获取请求头的值
Enumeration<String> getHeaderNames()
:获取所有的请求头名称
Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String s = headerNames.nextElement(); String header = request.getHeader(s); System.out.println(header); }
- 获取请求体数据:
- 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- 步骤:
- 获取流对象
BufferedReader getReader()
:获取字符输入流,只能操作字符数据
ServletInputStream getInputStream()
:获取字节输入流,可以操作所有数据 - 从流对象中获取数据
- 获取流对象
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { BufferedReader reader = request.getReader(); String line=null; while ((line=reader.readLine())!=null){ System.out.println(line); // username=milesmatheson&password=123 } }
<form action="/day22_2_war_exploded/requestdemo3" method="post"> <input type="text" placeholder="请输入用户名" name="username"><br> <input type="text" placeholder="请输入密码" name="password"><br> <input type="submit" value="注册"> </form>
- 获取请求行消息:
- 其他功能:
2.1 获取请求参数,通用的方式
2.1.1String getParameter(String name)
:根据参数名称获取参数值
2.1.2String username = request.getParameter("password"); System.out.println(username);
String[] getParameterValues(String name)
:根据参数名称获取参数值的数组
2.1.3String[] parameterValues = request.getParameterValues("username"); System.out.println(Arrays.toString(parameterValues));
Enumeration<String> getParameterNames()
:获取所有请求的参数名称
2.1.4Enumeration<String> parameterNames = request.getParameterNames(); while (parameterNames.hasMoreElements()){ System.out.println(request.getParameter(parameterNames.nextElement())); }
Map<String,String[]> getParameterMap()
:获取所有参数的map集合Map<String, String[]> parameterMap = request.getParameterMap(); Set<String> strings = parameterMap.keySet(); for (String string : strings) { System.out.println(string); }
2.2 请求转发:一种在服务器内部的资源跳转方式中文乱码问题 * get方式:tomcat8已经将get方式乱码问题解决了 * post方式: * 再获取参数前,设置request的编码 request.setCharacterEncoding("utf-8"),解决乱码问题
2.2.1 步骤:
2.2.1.1 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
2.2.1.2 使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletResponse response)
2.2.2 特点:RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestdemo5"); requestDispatcher.forward(request,response); // 触发了demo5
浏览器地址栏路径不发生变化
只能转发到当前服务器内部资源中
转发只是一次请求
2.3 共享数据
2.3.1 域对象:一个有作用范围的对象,可以在范围内共享数据
2.3.2 request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
2.3.3 方法:
setAttribute(String name,Object obj)
:存储数据
Object getAttribute(String name)
:通过键获取值
removeAttribute(String name)
:通过键来移除键值对// demo4 request.setAttribute("msg","hello"); RequestDispatcher requestDispatcher = request.getRequestDispatcher("/requestdemo5"); requestDispatcher.forward(request,response);
2.4 获取ServletContext// demo5 Object msg = request.getAttribute("msg"); System.out.println(msg); // hello
ServletContext getServletContext()
扩展
- BeanUtils工具类,简化数据封装
用于封装JavaBean
- JavaBean:标准的Java类
1.1 类必须被public修饰
1.2 必须提供空参的构造器
1.3 成员变量必须使用private修饰
1.4 提供公共的setter和getter方法 - 概念:
2.1 成员变量:
2.2 属性:setter和getter方法截取后的产物 - 方法:
setProperty()
getProperty()
populate(Object obj,Map map)
:将Map集合的键值对信息,封装到对应的JavaBean对象中
练习
-
登录案例
需求: 1.编写login.html登录页,password和username两个输入框 2.使用Druid数据库连接池技术操作mysql,user数据表 3.使用JdbcTemplate技术封装JDBC 4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您 5.登录失败跳转到FailServlet展示:登录失败!用户名或密码错误
<!-- login.html--> <form action="/day23_war_exploded/loginservlet" method="post"> 用户名:<input type="text" placeholder="请输入用户名" name="username"><br> 密码:<input type="text" placeholder="请输入密码" name="password"><br> <input type="submit" value="登录"> </form>
// druid.properties driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///day23 username=root password=root initialSize=5 maxActive=10 maxWait=3000
// jar包,放在web-info文件夹里面 commons-logging-1.2.jar druid-1.0.9.jar jsoup-1.12.1.jar JsoupXpath-0.3.2.jar mchange-commons-java-0.2.12.jar mysql-connector-java-5.1.9.jar spring-beans-5.1.10.RELEASE.jar spring-core-5.1.10.RELEASE.jar spring-jdbc-5.1.10.RELEASE.jar spring-tx-5.1.10.RELEASE.jar
// 创建数据库day23和表user CREATE DATABASE day23; USE day23 CREATE TABLE USER( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(32) UNIQUE NOT NULL, PASSWORD VARCHAR(32) NOT NULL )
public class User { private int id; private String username; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } 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; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } }
public class JDBCUtils { // JDBC的工具类,使用Druid的连接池 private static DataSource ds; static { try { // 加载配置文件 Properties properties = new Properties(); // 使用Classloader加载配置文件,获取字节输入流 InputStream resourceAsStream = JDBCUtils.class. getClassLoader().getResourceAsStream("druid.properties"); properties.load(resourceAsStream); // 初始化连接池 ds = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } ds } // 获取连接池方法 public static DataSource getDataSource(){ return ds; } // 获取连接Connection方法 public static Connection getConnection() throws SQLException { return ds.getConnection(); } }
public class UserDao { // 声明JDBCTemplate对象共用 private JdbcTemplate template=new JdbcTemplate(JDBCUtils.getDataSource()); // 操作数据库中user表的类 public User login(User loginUser){ try { // 编写sql String sql = "select * from user where username=? and password=?"; // 调用query方法 User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), loginUser.getUsername(), loginUser.getPassword()); return user; }catch (Exception e){ return null; } } }
@WebServlet("/loginservlet") public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置编码 request.setCharacterEncoding("utf-8"); /* // 获取请求参数 String username = request.getParameter("username"); String password = request.getParameter("password"); // 封装user对象 User loginUser = new User(); loginUser.setUsername(username); loginUser.setPassword(password); */ // 获取所有请求参数 Map<String, String[]> parameterMap = request.getParameterMap(); // 创建User对象 User loginUser = new User(); // 使用BeanUtils 封装,需要导入commons-beanutils-1.9.4.jar包 try { BeanUtils.populate(loginUser,parameterMap); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } // 调用UserDao的login方法 UserDao dao=new UserDao(); User user = dao.login(loginUser); // 判断 if(user==null){ // 登录失败 // 转发 request.getRequestDispatcher("/failservlet").forward(request,response); }else{ // 登录成功 request.setAttribute("user",user); request.getRequestDispatcher("/successservlet").forward(request,response); } } }
@WebServlet("/failservlet") public class FailServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 给页面写已经话 // 设置编码 response.setContentType("text/html;charset=utf-8"); // 输出 response.getWriter().write("登录失败!用户名或密码错误"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }
@WebServlet("/successservlet") public class SuccessServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取request域中共享的user对象 User user = (User) request.getAttribute("user"); // 给页面写已经话 // 设置编码 response.setContentType("text/html;charset=utf-8"); // 输出 response.getWriter().write("登录成功!"+user.getUsername()+"欢迎您"); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request,response); } }