Request
除了获取请求数据之外,还要讲一下他的其他方法:
-
其他方法
-
获取请求参数通用方法
- String getParameter(String name) : 根据参数名称获取参数值
- String[] getParameterValues(String name) 根据参数名称获取参数值的数组 (多用于一些复选框)
- Enumeration getParameterNames() 获取所以请求参数名称
- Map<Stirng ,String[]> getParameterMap() : 获取所有参数与值的集合
中文乱码问题:
-
get方式:tomcat 8 已经将get方式的乱码问题解决了
-
post方式:依然乱码
-
原因:get通过url获取参数,而post表面是通过getParameter方式获取,本质是通过流获取
-
纠正乱码:获取参数前,设置request的编码
-
// 1.设置流的编码: req.setCharacterEncoding("utf-8");
-
-
请求转发:理解为一种在服务器内部的资源跳转方式
- 步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象进行转发:forward(ServletRequest req, ServletResponse reps)
- 特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中
- 转发是一次请求,多个资源使用的是同一次请求
- 步骤:
-
共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- setAttribute(String name , Object obj):存储数据
- Objec getAttribute(String name): 获取数据,通过键获取值
- removeAttribute(String name): 通过键值移除键值对
-
获ServletContext:
- ServletContext getServletContext( )
-
案例实践:用户登录
-
需求:
- login.html登录页面 user&pwd 两个输入框
- 使用Druid数据库连接池技术,操作mysql,
- 使用JdbcTemplate技术封装JDBC
- 登录成功跳转到SuccessServlet展示:登录成功!user欢迎您
- 登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
-
分析:
-
步骤:
-
创建项目:
-
准备材料
- login.html
- druid.properties文件 -> src. (数据库连接池配置文件)
- lib目录里面下辖的jar包放到webapp/WEB-INF下
-
创建数据库环境
create DATABASE NorthWind USE NorthWind CREATE table user( id int primary key AUTO_INCREMENT, username VARCHAR(32) UNIQUE NOT NULL, password VARCHAR(32) NOT NULL )
-
创建包,创建user类对应user表,并且生成他的getter和setter方法、以及toString方法。
-
完成userDao
public class UserDao{ private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource()); /** * 登录方法 * @param loginUser * @return user包含用户全部数据 */ public User login(User loginUser){ String sql = "select * from USER where username = ? and password = ?"; User user = template.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), loginUser.getUsername(),loginUser.getPassword()); return user; } }
-
创建一个Util包,下面包含JDBCUtils的工具类,用于数据库连接
public class JDBCUtils{ private static DataSource ds; // 代码块用于初始化 static { try { // 1.加载配置文件 Properties pro = new Properties(); InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); // 2.初始化连接池对象 ds = DruidDataSourceFactory.createDataSource(pro); } catch (IOException e){ e.printStackTrace(); } catch (Exception e){ e.printStackTrace(); } } // 获取链接池对象 public static DataSource getDataSource(){ return ds; } // 获取连接Connection对象 public static Connection getConnection() throws SQLException { return ds.getConnection(); } }
-
编写LoginServlet类
@WebServlet("/loginServlet") public class LoginServlet extends HttpServlet{ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doGet(req,resp); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1. req.setCharacterEncoding("utf-8"); // 2. String username = req.getParameter("username"); String pwd = req.getParameter("password"); // 3. User loginUser = new (username,pwd); // 4. UserDao userDao = new UserDao(); User user = userDao.login(loginUser); // 5. if(user==null){ // 登录失败 req.getrequestDispatcher("/failServlet").forward(req,resp); }else{ // 登录成功 req.setAttribute("user",user); req.getrequestDispatcher("/successServlet").forward(req,resp); } } } }
-
实现FailServlet和SuccessServlet
-
BeanUtils工具类简化数据封装
Map<Srting ,String[]>map = req.getParameterMap(); User loginUser = new User(); // 使用BeanUtils try{ BeanUtils.populate(loginUser,map); }catch (Exception e){ e.printStackTrace(); }
用于封装javaBean的工具类
- JavaBean:标准的Java类
- JavaBean的要求:
- 类必须被public修饰
- 必须提供空参数的构造器
- 成员变量必须使用private修饰
- 提供公共setter和getter方法
- 功能:封装数据
- JavaBean的要求:
- 概念:
- 成员变量:就是那些变量
- 属性:setter和getter方法截取后的产物(大多数时候和成员变量一样,在有些特例下不一样)
- 例如:getUserName() -> Username --> username 这是一般情况下属性和成员变量的映射
- getterXingbie() 这个方法去修改gender值,类的属性叫xingbie而不是gender
- 方法:
- setProperty( )
- getProperty( )
- populate( ) 最重要
- JavaBean:标准的Java类
-
-
-