1,Session的基本使用
*创建session
HttpSession session = req.getSession();
System.out.println(session.getId());
session.setAttribute("msg","hello");
*获取session
HttpSession session = req.getSession();
System.out.println(session.getId());
Object msg = session.getAttribute("msg");
System.out.println(msg);
*移除session
HttpSession session = req.getSession();
System.out.println("Demo03Servlet" +session.getId());
session.removeAttribute("msg");
2,Session案例之登录
登录功能–UserDao
public class UserDaoImpl implements UserDao {
@Override
public User login(User inputUser) throws SQLException {
QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
// User existUser = queryRunner.query(
// "select * from tb_user where username = ? and password = ?",
// new ResultSetHandler<User>() {
// @Override
// public User handle(ResultSet resultSet) throws SQLException {
// User user = null;
// if(resultSet.next()){
// Integer id = resultSet.getInt("id");
// String username = resultSet.getString("username");
// String password = resultSet.getString("password");
// user = new User(id,username,password);
// }
// return user;
// }
// },
// inputUser.getUsername(),
// inputUser.getPassword());
User existUser = queryRunner.query(
"select * from tb_user where username = ? and password = ?",
new BeanHandler<User>(User.class),
inputUser.getUsername(),
inputUser.getPassword());
return existUser;
}
}
LoginServlet
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
private UserDao userDao = new UserDaoImpl();
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
User inputUser = new User();
inputUser.setUsername(username);
inputUser.setPassword(password);
try {
User existUser = userDao.login(inputUser);
if(null==existUser){
//登录失败,请求转发,跳转到登录页面
req.getRequestDispatcher("/lpgin,html").forward(req,resp);
}else{
//登录成功,重定向,跳转到显示用户信息
req.getSession().setAttribute("existUser",existUser);
resp.sendRedirect("/day57/showIndex");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
显示用户信息-ShowIndexServlet
@WebServlet(name = "ShowIndexServlet",urlPatterns = "/showIndex")
public class ShowIndexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
User existUser = (User)req.getSession().getAttribute("existUser");
if(null!=existUser){
resp.getWriter().write("欢迎回来,"+existUser.getUsername());
}else {
//方式一,提示未登录
// resp.getWriter().write("您还没有登录,<a href='/day57/login.html'>请登录</a>");、
//方式二,跳转登录页面
resp.sendRedirect("/day57/login.html");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
注意事项:
1,第三方jar包必须放到WEB-INF文件夹
2,登录失败使用请求转发,成功使用重定向(以后用的大多数时请求转发)
3,session案例之随机验证码
显示验证码–
1,创建图片对象
2,画背景
3,画边框
4,画干扰线
5,产生四位随机数,存储到session
6,画四位随机数
7,将图片相应到浏览器
public class CreateCodeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int width = 60;//定义图片宽度
int height = 32;//定义图片高度
//创建图片对象
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//创建画笔对象
Graphics g = image.getGraphics();
//设置背景颜色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0,0,width,height);
//设置边框
g.setColor(Color.black);
g.drawRect(0,0,width-1,height-1);
//产生随机数
Random rdm = new Random();
//画随机圆点
for (int i = 0;i<50;i++){
int x = rdm.nextInt(width);
int y = rdm.nextInt(height);
g.drawOval(x,y,0,0);
}
//产生随机字符串
String hash1 = Integer.toHexString(rdm.nextInt());
//生成四位随机验证码
String capstr = hash1.substring(0,4);
//将产生的验证码存储到session域中,方便以后进行验证码校验
request.getSession().setAttribute("existCode",capstr);
System.out.println(capstr);
g.setColor(new Color(0,100,0));
g.setFont(new Font("Candara",Font.BOLD,24));
g.drawString(capstr,8,24);
g.dispose();
response.setContentType("image/jpeg");
OutputStream strm = response.getOutputStream();
ImageIO.write(image,"jpeg",strm);
strm.close();
}
校验验证码:
//验证输入的验证码
String validateCode = req.getParameter("validateCode");
//将输入的和产生的随机验证码校验
String existCode = (String)req.getSession().getAttribute("existCode");
if(validateCode.equals(existCode)){
//校验成功
String username = req.getParameter("username");
String password = req.getParameter("password");
User inputUser = new User();
inputUser.setUsername(username);
inputUser.setPassword(password);
try {
User existUser = userDao.login(inputUser);
if(null==existUser){
//登录失败,请求转发,跳转到登录页面
req.getRequestDispatcher("/lpgin,html").forward(req,resp);
}else{
//登录成功,重定向,跳转到显示用户信息
req.getSession().setAttribute("existUser",existUser);
resp.sendRedirect("/day57/showIndex");
}
} catch (SQLException e) {
e.printStackTrace();
}
}else {
//验证码校验不通过,跳转到登录页面
req.getRequestDispatcher("/login.html").forward(req,resp);
}
4,复习–自定义DbUtils之增删改
JDBC开发步骤
- 准备环境
- 加载驱动
- 获取连接
- 编写sql语句,获取执行sql
- 设置参数,执行sql(查询,执行结果集)
- 释放资源
相同点:
1,获取连接
4,执行sql语句
5,释放资源
不同点:
2,sql语句
3,设置参数
public static void update(String sql,Object... parameters){
Connection connection = null;
PreparedStatement statement = null;
try {
connection = JDBCUtils.getConnection();
statement = connection.prepareStatement(sql);
//设置参数值的时候,参照的是parameters的个数,应该参照有多少个问号
ParameterMetaData parameterMetaData = statement.getParameterMetaData();
for (int i = 0;i<parameterMetaData.getParameterCount();i++){
statement.setObject(i+1,parameters[i]);
}
statement.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}finally {
JDBCUtils.release(connection,statement);
}
}
5,复习–自定义DbUtils之查询
相同点:
1,获取连接
5,释放资源
不同点:
2,sql语句
3,设置参数
4,处理结果集
MyResultSetHandler接口–处理结果集,并得到想要类型的数据
public interface MyResultSetHandler<T>{
/**
* 处理结果集,并返回想要的类型的数据
* @param resultSet 结果集
* @return 想要的类型的数据
* @throws Exception
*/
T handle(ResultSet resultSet) throws Exception;
}
通用query方法
public static<T> T query(String sql,MyResultSetHandler<T> handler,Object...parameters){
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
try {
connection = JDBCUtils.getConnection();
statement = connection.prepareStatement(sql);
for (int i = 0;i<statement.getParameterMetaData().getParameterCount();i++){
statement.setObject(i+1,parameters[i]);
}
resultSet = statement.executeQuery();
//处理结果集,返回结果
T t = handler.handle(resultSet);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
测试代码
public static void main(String[] args) {
User existUser = MyDbUtils.query("select * from tb_user where id = ?",
new MyResultSetHandler<User>() {
@Override
public User handle(ResultSet resultSet) throws Exception {
User user = null;
while (resultSet.next()){
Integer id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
user = new User(id,username,password);
}
return user;
}
},1);
System.out.println(existUser);
}
存在问题:
结果集处理太麻烦,具体体现在处理结果集的具体实现上,还是太麻烦
解决思路:
如果结果集处理之后返回的时单条记录,封装好一个MyBeanHandler
如果结果集处理之后返回的是多条记录,封装好一个MyBeanListHandler