Request与Response
- Request对象与Response对象的原理
- request和response对象是由服务器创建的。我们来使用它们
- request对象是来获取请求信息,response对象是来设置响应信息
Request
request对象继承体系结构
ServletRequest
–接口
| 继承
HttpServletRequest
–接口
| 实现
org.apache.catalina.connector.RequestFcade
类(tomcat)
request功能
获取请求信息数据
-
获取请求行数据
-
GET /servlet/demo1?name=zhangsan HTTP/1.1
-
方法:
-
获取请求方式:GET
String geteMethod()
-
(*)获取虚拟目录:/servlet
String getContextPath()
-
获取Servlet路径:/demo1
String getServletPath()
-
获取get方式请求参数:name=zhangsan
String getQueryString()
-
(*)获取请求URI:/servlet/demo1
-
String getRequestURI()
:/servlet/demo1 -
StringBuffer getRequestURL()
:http://localhost/servlet/demo1 -
URL:统一资源定位符:中华人民共和国
-
URI:统一资源标识符:共和国
-
-
获取协议及版本:HTTP/1.1
String getProtocol()
-
获取客户机的IP地址:
String getRemoteAddr()
-
-
-
获取请求头数据
- 方法:
(*)String getHeader(String name)
:通过请求头名称获取请求头的值Enumeration<String> getHeaderNames()
:获取所有的请求头名称
- 方法:
-
获取请求体数据:
- 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数
- 步骤:
- 获取流对象
- BuffereReader getReader():获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
- 再从流对象中拿数据
- 获取流对象
其他功能
-
获取请求参数通用方法
String getParameter(String name)
:根据参数名称获取参数值String[] getParameterValues(String name)
:根据参数名称获取数值的数组Enumeration<String> getParameterNames()
:获取所有请求的参数名称Map<String,String[] getParameterMap()
:获取所有参数的map集合
中文乱码问题
- get方式:tomcat 8 已经将get方式乱码问题解决了
- post方式:会乱码
- 解决:在获取参数前,设置request的编码
request.setcharacterEncoding("utf-8")
- 解决:在获取参数前,设置request的编码
-
请求转发:
- 步骤:
- 通过request对象获取请求转发器对象:
RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:
forward(ServletRequest request, ServletResponse response)
- 通过request对象获取请求转发器对象:
- 特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中
- 转发是一次请求
- 步骤:
-
共享数据:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
void SetAttribute(String name,Object obj)
:存储数据Object getAttribute(String name)
:通过键获取值removeAttribute(String name)
:通过键移除键值对
-
获取ServletContext
ServletContext getServletContext()
案例:用户登录
需求
-
编写login.html登录页面
username & password 两个输入框
-
使用Druid数据连接池技术操作mysql,数据库中user
-
使用JDBCTemplate技术封装JDBC
-
登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
-
登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
分析
开发步骤
-
创建项目,导入html页面,配置文件,jar包
-
创建数据库环境
-
创建包domain,创建user类
-
创建JDBCUtils工具类
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.IOException; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; /** * @author zhuxianglong * @version 1.0 * @date 2021/8/27 0:45 */ public class JDBCUtil { //私有化构造方法 private JDBCUtil(){ } //1.定义成员变量DataSource private static DataSource ds; static { try { //2.加载配置文件 Properties pro = new Properties(); pro.load(JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties")); //3.获取DataSource ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接的方法 */ public static Connection getConnection(){ try { return ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 释放资源 */ public static void close(Statement stmt, Connection conn){ /*if (stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null){ try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } }*/ close(conn,stmt,null); } public static void close(Connection conn, Statement stmt, ResultSet rs){ if (rs != null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null){ try { conn.close();//归还连接 } catch (SQLException e) { e.printStackTrace(); } } } /** * 获取连接池的方法 */ public static DataSource getDataSoutce(){ return ds; } }
-
创建包dao,创建类UserDao,提供login方法
import net.seehope.domain.User; import net.seehope.util.JDBCUtil; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; /** * @author zhuxianglong * @version 1.0 * @date 2021/8/27 0:51 * 操作数据库中user表中的类 */ public class UserDao { //声明JDBCTemplate对象共用 private JdbcTemplate template = new JdbcTemplate(JDBCUtil.getDataSoutce()); /** * 登录方法 * @param loginUser 只有用户名和密码 * @return user包含用户全部数据,没有查询到,返回null */ public User login(User loginUser)