JavaWebCase
案例:用户登录
用户登录案例需求
- 编写login.html登录页面
username & password 两个输入框 - 使用Druid数据库连接池技术,操作mysql,day14数据库中user表
- 使用JdbcTemplate技术封装JDBC
- 登录成功跳转到SuccessServlet展示:登录成功!用户名,欢迎您
- 登录失败跳转到FailServlet展示:登陆失败!用户名或密码错误
分析

开发步骤
创建项目
创建JavaEE项目,导入 login.html 页面,druid.properties 配置文件,导入依赖 jar 包
- login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<form action="/day14_test/loginServlet" method="post">
用户名 <input type="text" name="username"><br/>
密码 <input type="password" name="password"><br/>
<input type="submit" value="登录">
</form>
</body>
</html>
- druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db3
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
maxIdle=8
minIdle=3
创建数据库环境
CREATE DATABASE day14;
USE day14;
CREATE TABLE USER (
id INT PRIMARY KEY AUTO_INCREMENT, -- 编号
username VARCHAR(32) NOT NULL UNIQUE, -- 用户名
PASSWORD VARCHAR(32) NOT NULL -- 密码
);
DROP DATABASE IF EXISTS day14;
SELECT * FROM USER;
INSERT INTO USER(id,username,PASSWORD) VALUES(NULL, 'superbaby','123');
创建包 com.my.domain,创建类User
package com.my.domain;
/**
* 用户的实体类
*/
public class User {
private int id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + 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;
}
}
创建包 com.my.dao,创建类UsesrDao,提供login方法
package com.my.dao;
import com.my.domain.User;
import com.my.util.JDBCUtils;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* 操作数据库中 User表的类
*/
public class UserDao {
// 声明JDBCTemplate对象共用
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 登录方法
*
* @param loginUser 只有用户名和密码
* @return user包含用户全部数据,没有查询到,返回 null
*/
public User login(User loginUser) {
User user = null;
try {
// 1.编写sql
String sql = "select * from User where username = ? and password = ?";
// 2.调用query方法
user = template.queryForObject(sql,
new BeanPropertyRowMapper<User>(User.class),
loginUser.getUsername(), loginUser.getPassword());
return user;
} catch (DataAccessException e) {
e.printStackTrace(); // 后期会记录在日志
return null;
}
}
}
编写 com.my.web.servlet.LoginServlet类
package com.my.web.servlet;
import com.my.dao.UserDao;
import com.my.domain.User;
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;
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1.设置编码,防止中文乱码
req.setCharacterEncoding("utf-8");
// 2.获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 3.封装User对象
User loginUser = new User();
loginUser.setUsername(username);
loginUser.setPassword(password);
// 4.调用UserDao的login方法
UserDao dao = new UserDao();
User user = dao.login(loginUser);
// 5.判断user
if (null == user) {
// 登录失败
// 转发
req.getRequestDispatcher("/failServlet").forward(req, resp);
} else {
// 登录成功
// 存储数据
req.setAttribute("user", user);
// 转发
req.getRequestDispatcher("/successServlet").forward(req, resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
login.html中的form表单的action路径的写法
虚拟路径+Servlet资源路径
BeanUtils工具类,简化数据封装
- 用于封装JavaBean的
- JavaBean:标准的Java类
- 要求:
- 类必须被public修饰
- 必须提供空参的构造器
- 一对getter和setter方法
- 成员变量必须使用private修饰
- 概念:
- 成员变量:
- 属性:setter和getter方法截取后的产物
- 例如:getUsername() --> Username --> username
- 要求:
- 方法
- setProperties():
- getProperties():
- populate(Object obj,Map map):将map集合的键值对信息,封装到对应的JavaBean对象中,把键当作属性名称,把值当作JavaBean对应的属性的值
案例:文件下载
- 文件下载需求:
- 页面显示超链接
- 点击超链接后弹出下载提示框
- 完成图片文件下载
分析:
- 超链接指向的资源如果能被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
- 任何资源的下载都必须弹出下载提示框
- 使用响应头设置资源的打开方式:
- content-disposition:attachment;filename=xxx
步骤:
- 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
- 定义Servlet
- 获取文件名称(获取request参数)
- 使用字节输入流加载文件进内存
- 指定response的响应头:content-disposition:attachment;filename=xxx
- 将数据写出到response输出流
问题:
- 中文文件问题
- 解决思路:
- 获取客户端使用的浏览器版本信息
- 根据不同的版本信息,设置filename的编码方式不同
- 解决思路:
- 中文文件问题
代码实现
- download.html
<a href="/day15/img/1.jpg">图片</a>
<br/>
<a href="/day15/img/2.flv">视频</a>
<hr/>
<!-- get请求在tomcat8中已解决中文乱码问题 -->
<a href="/day15/downloadServlet?filename=1.jpg">图片1</a>
<br/>
<a href="/day15/downloadServlet?filename=九尾.jpg">九尾</a>
<br/>
<a href="/day15/downloadServlet?filename=2.flv">视频</a>
- DownloadServlet.java
package com.my.web.download;
import com.my.web.utils.DownLoadUtils;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
/**
* 附件下载案例
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1.获取请求参数,文件名称
String filename = request.getParameter("filename");
// 2.使用字节输入流加载文件进内存
// 2.1 获取ServletContext对象
ServletContext servletContext = this.getServletContext();
// 2.2 获取文件服务器真实路径
String realPath = servletContext.getRealPath("/img/" + filename);
// 2.3 使用字节流关联
FileInputStream fis = new FileInputStream(realPath);
// 3. 设置response的响应头
String mimeType = servletContext.getMimeType(filename); // 获取文件扩展名对应的mime类型
// 3.1 设置响应头的类型:content-type
response.setHeader("content-type", mimeType);
// 3.2 设置响应头的打开方式:content-disposition
// 解决中文文件名问题
// 1.获取user-agent请求头
String agent = request.getHeader("user-agent");
// 2.使用工具类方法编码文件名即可
filename = DownLoadUtils.getFileName(agent, filename);
response.setHeader("content-disposition", "attachment;filename=" + filename);
/*
// 简单的形式,设置编码,是在获取流之前设置
response.setContentType("text/html;charset=utf-8");
*/
// 4. 将输入流的数据写出到输出流中
ServletOutputStream sos = response.getOutputStream();
byte[] buff = new byte[1024 * 6]; // 缓冲数组
int len = 0; // 读取的有效个数
while ((len = fis.read(buff)) != -1) {
sos.write(buff, 0, len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
JavaWebCase的更多相关文章
随机推荐
- AJ学IOS 之控制器view显示中view的父子关系及controller的父子关系_解决屏幕旋转不能传递事件问题
AJ分享,必须精品 一:效果 二:项目代码 这个Demo用的几个控制器分别画了不通的xib,随便拖拽了几个空间,主要是几个按钮的切换,主要代码展示下: // // NYViewController.m ...
- 如何初学python?资深程序员浅谈,教你学会入门python
我认为python应该是现在市面上最简单,也是最值钱的一门编程语言,所以学习的人是越来越多,但是,如何初学python?这个问题困扰着很多初学python的人,今天,给大家简单聊聊这个话题. 我曾经也 ...
- python干货-类属性和方法,类的方法重写
类属性与方法 类的私有属性 __private_attrs: 两个下划线开头,表明为私有,外部不可用,内部使用时self.__private_attrs. 类的方法 在类的内部,使用 def 关键字来 ...
- ASE past project:interview & analysis
采访往届ASE课程学员李潇,他所在的团队blog戳这里http://www.cnblogs.com/smart-code/ Q1:师兄你觉得在团队项目中,有哪些需要注意的事情? A1:团队合作吧.首先 ...
- 任意用户密码重置的十种姿势=====>学习笔记!
原学习视频链接:https://www.butian.net/School/content?id=214%E2%80%98 1.验证码不失效 原因:获取的验证码缺少时间限制,仅判断验证码是否不正确而未 ...
- Springboot:第一个Springboot程序(一)
1.创建Springboot项目 选择创建Springboot项目: 填写项目基本信息: 选择Springboot版本以及web依赖(内嵌tomcat): 创建完成: 创建完成后 等待构建maven项 ...
- JasperReports入门教程(一):快速入门
JasperReports入门教程(一):快速入门 背景 现在公司的项目需要实现一个可以配置的报表,以便快速的适应客户的需求变化.后来在网上查资料发现可以使用JasperReports + Jaspe ...
- 解决Lost connection to MySQL server during query错误方法/Mysql关闭严格模式
使用Navicat 导入MySQL数据库的时候,出现了一个严重的错误,Lost connection to MySQL server during query,字面意思就是在查询过程中丢失连接到MyS ...
- XSS跨站脚本攻击学习笔记(pikachu)
颓废了几天,该好好努力了. XSS概述 XSS漏洞是web漏洞中危害较大的漏洞,是一种发生在web前端的漏洞,所以危害的对象也主要是前端用户,XSS可以用来进行钓鱼攻击,前端js挖矿,获取用户cook ...
- 字符串的z型转换
class Solution(object): def convert(self, s, numRows): if numRows==1: return ...