JavaWeb Serlect请求,请求转发,数据库练习
2018/8/14
今天对Javaweb的servlet的请求,请求转发结合数据库练习了一个登录项目案例
1.案例
需求:
1.编写login.html登录页面
username & password 两个输入框
2.使用Druid数据库连接池技术,操作mysql,day14数据库中user表
3.使用JdbcTemplate技术封装JDBC
4.登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
5.登录失败跳转到FailServlet展示:登录失败,用户名或密码错误
1.编写login.html页面
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<style>
*{
margin: 0px;
padding: 0px;
}
</style>
</head>
<body>
<!--<img src="image/2.jpg" style="width: 100%;height: 100%;top: 0;left: 0;position: absolute">-->
<div style="background: aqua;width: 100%;height: 100%;position: absolute">
<div style="position: absolute;left: 650px;top: 250px">
<form action="servlet1" method="post">
用户名:<input type="text" name="name" placeholder="请输入用户名"><br><br>
密 码:<input type="text" name="possword" placeholder="请输入密码"><br><br>
<input type="submit" value="登录" style="margin-left: 20px">
<input type="reset" value="重置" style="margin-left: 100px">
</form>
</div>
</div>
</body>
</html>
页面样式图
没怎么样写排版,和样式所以看看就行
2.数据库使用
这里使用的是数据库连接池技术,使用Druid连接池和JDBCTempla技术对数据库进行简化操作,在servlet中最后还使用了BeanUtils技术。
1.创建数据表的javaBean实体对象类
代码如下
package cn.zsc.doit;
//数据表studentTable的实体类(javaBean)
public class studentTable {
private Integer id;
private String name;
private String possword;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPossword() {
return possword;
}
public void setPossword(String possword) {
this.possword = possword;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", possword='" + possword + '\'' +
'}';
}
}
2.创建数据库的工具类JdbcUtils(由于连接数据库连接池,并且写定获取连接池的方法,获取连接的方法和归还连接的方法)
代码如下
package cn.zsc.utils;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.*;
import java.util.Properties;
public class jdbcUtils {
//创建数据库连接池的静态代码块
private static DataSource ds;
static {
try {
//加载配置文件
Properties properties=new Properties();
properties.load(jdbcUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
//初始化数据连接池对象
ds= DruidDataSourceFactory.createDataSource(properties);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/***
* 获取数据库连接池
* @return 数据库连接池
*/
public static DataSource getdatasource(){
return ds;
}
/***
* 获取连接
* @return 连接池的连接
* @throws SQLException
*/
public static Connection getconnection() throws SQLException {
return ds.getConnection();
}
/***
* 归还连接给连接池
* @param resultSet ResultSet参数
* @param statement Statement参数
* @param connection Connection参数
*/
public static void closs(ResultSet resultSet, Statement statement,Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}
}
3.创建操作数据库的Dao类里面包含一个登录的方法,返回的是数据表的JavaBean对象,方法参数也为数据表的JavaBean对象(使用jdbcTemplate的queryForObject方法)
代码如下
package cn.zsc.dao;
import cn.zsc.doit.studentTable;
import cn.zsc.utils.jdbcUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
//该类用于操作数据库Uer表的类
public class UserDao {
//声明成员变量JdbcTemplate
private JdbcTemplate jdbcTemplate=new JdbcTemplate(jdbcUtils.getdatasource());
/***
* 登录方法
* @param student 只有用户名和密码
* @return 用户所有的信息
*/
public studentTable login(studentTable student){
try {
//1.创建sql命令
String sql="select * from studentTable1 where name=? and possword=?";
//使用template的queryObject方法执行sql命令
studentTable User = jdbcTemplate.queryForObject(
sql, new BeanPropertyRowMapper<studentTable>(studentTable.class),
student.getName(), student.getPossword());
return User;
} catch (DataAccessException e) {
e.printStackTrace();
return null;
}
}
}
在代码中queryForObject的方法使用了BeanPropertyRomMapper对象为参数
该对象的泛型为数据表的JavaBean对象,参数为数据表JavaBean类的字节码文件。
4.开始编写servlet文件
代码如下
一开始获取请求参数时是这样写的
//1.获取用户输入的用户名和密码
String name = request.getParameter("name");
String possword = request.getParameter("possword");
//2.创建studentTable实体类并将值通过set方法输入,封装studentTable对象
studentTable studentTable=new studentTable();
studentTable.setName(name);
studentTable.setPossword(possword);
这些写的确可以获取到用户名和密码,这只是获取的数据比较少如果获取的请求参数数据一旦多不仅获取麻烦,赋值给数据表的实体对象类更麻烦,一点都没有简化,所以下面我使用了BeanUtils包来创建Beanutils对象使用里面的populate方法来简化操作。
代码如下
package cn.zsc.Server;
import cn.zsc.dao.UserDao;
import cn.zsc.doit.studentTable;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet(name = "cn.zsc.Server.loginServlet",urlPatterns = "/servlet1")
public class loginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置编码方式,防止中文乱码
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
/*//1.获取用户输入的用户名和密码
String name = request.getParameter("name");
String possword = request.getParameter("possword");
//2.创建studentTable实体类并将值通过set方法输入,封装studentTable对象
studentTable studentTable=new studentTable();
studentTable.setName(name);
studentTable.setPossword(possword);*/
/***
* 这里使用BeanUtils工具jar包来简化操作
* 如果有大量的请求参数要获取并且要封装就可以使用这种方法
* 操作步骤
*/
//1.获取所有的请求参数并且放进map集合中使用getParameteMap方法,即获取获取用户输入的用户名和密码
Map<String, String[]> parameterMap = request.getParameterMap();
//2.创建studentTable实体类对象
studentTable studentTable = new studentTable();
//2.1使用BeanUtils的populate方法进行studentTable的封装,该方法参数为要封装的实体类,和封装的map集合
try {
BeanUtils.populate(studentTable,parameterMap);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//3.创建UserDao对象
UserDao userDao=new UserDao();
//4使用UserDao的login方法并且将值赋值给Object对象
Object logintext = userDao.login(studentTable);
//5.进行登录判断
if (logintext==null){
//如果登录失败直接请求转发
request.getRequestDispatcher("/Fail").forward(request,response);
}
else {
//如果查询到了就将用户名和密码储存到请求作用域中并且请求转发,
request.setAttribute("nameA",studentTable.getName());
request.setAttribute("posswordA",studentTable.getPossword());
request.getRequestDispatcher("/Success").forward(request,response);
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
Beanutils使用方法
1.获取所有的请求参数并且放进map集合中使用getParameteMap方法
2.创建studentTable实体类对象
3.使用BeanUtils的populate方法进行studentTable的封装,该方法参数为要封装的实体类,和封装的map集合
5.对登录失败和成功写相应的servlet代码,在上面的servlet中进行了请求转发和将获取的用户名和密码储存到了请求作用域中,在登录成功的servlet中就可以使用这些信息
1.登录成功的servlet
代码如下
package cn.zsc.Server;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "cn.zsc.Server.SuccessServlet",urlPatterns = "/Success")
public class SuccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取request请求的作用域,用户名和密码的值
Object nameA = request.getAttribute("nameA");
Object posswordA = request.getAttribute("posswordA");
//输出到页面上
PrintWriter out = response.getWriter();
out.println("登录成功!"+nameA+"欢迎您。");
out.println("<br>");
out.println("密码为"+posswordA);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
2.失败的servlet
package cn.zsc.Server;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "cn.zsc.Server.FailServlet",urlPatterns = "/Fail")
public class FailServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决中文乱码问题
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//将失败结果输出到页面上
PrintWriter out = response.getWriter();
out.println("登录失败,用户名或者密码错误");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
注意在编写servlet时一定要对中文编码进行处理,防止出现中文乱码的问题
解决方法
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
2.对BeanUtils工具类的简单介绍
下面是笔记截图
记住该对象可以直接使用,记住该对象的populate方法的参数,并且在使用该对象时要导入相应的包