配置tomcat
我的项目包结构如下,其中在web/WEB_INF 目录下创建两个文件夹:classes和lib( classes 用来存放编译后输出的class 文件,lib用于存放第三方jar包)
配置文件夹路径 File -> ProjectStructure (ctrl + shift + Alt + s)或者使用工具栏的快捷键 -> 选择Modules->选择Paths -> 选择“Use module compile out path”-> 将Outputpath 和Test outputpath 都设置为刚刚创建的classes文件夹
File -> ProjectStructure (ctrl + shift + Alt + s)或者使用工具栏的快捷键 -> 选择Modules -> 选择Dependencies -> + -> 选择 “1JARS or directories ...” -> 选择刚刚创建的lib文件夹 -> OK
举个例子
controller:登陆界面(同时设置7天免登录)
@WebServlet("/login")
public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;
private AccountService service;
public Login(){
super();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 封装数据(如果为空->4)
// 1.1声明一个存储对象的容器
Account account = null;
String sign = null; // 复选框
String USER_NAME = null;
String PASSWORD = null;
// 1.2从参数中获取对象
USER_NAME = req.getParameter("uname");
PASSWORD = req.getParameter("pwd");
sign = req.getParameter("sign");
if (USER_NAME!=null && PASSWORD!=null){
account = new Account(USER_NAME,PASSWORD);
}else {
// 1.3如果参数为获取数据,则从cookie中获取
// 1.3.1获取cookie数据
Cookie[] arr = req.getCookies();
// 1.3.2利用循环对cookie数组进行遍历,判断是否有密码存储
for (Cookie ck : arr){
if ("uname".equals(ck.getName())){
USER_NAME = ck.getValue();
}
if ("pwd".equals(ck.getName())){
PASSWORD = ck.getValue();
}
}
// for循环结束后,将数据进行封装
if (USER_NAME!=null && PASSWORD!=null){
account = new Account(USER_NAME,PASSWORD);
}
}
// 1.4判断是否都没有拿到数据,如果都没有数据则返回login.jsp不再执行以下代码
if (account == null){
resp.sendRedirect("index.jsp");
return; // 后续不再执行
}
// 2.实例化service对象
service = new AccountServiceImpl();
// 3.调用方法:更具用户名和密码查询用户信息,如果没有返回null
account = service.login(account);
// 4.根据返回结果进行操作
if (account == null){
// 4.1如果返回null,则登陆失败,重定向到index.jsp页面
resp.sendRedirect("index.jsp?msg=1");
}else {
// 4.2查到了用户信息,则登陆成功,将用户信息存储到session中,重定向到page/index.html
// 4.2.1从request中获取session对象
HttpSession session = req.getSession();
// 4.2.2将用户信息存储到session对象的属性
session.setAttribute("accountInfo",account);
// 4.2.3判断免登录系统是否被选中,如果选中了,则建立cookie,存储用户名和密码,将cookie添加到response
if (sign !=null){
// 创建两个cookie对象
Cookie ck_name = new Cookie("uname",account.getUname());
Cookie ck_pwd = new Cookie("pwd",account.getPwd());
// 设置cookie的属性(cookie的生命周期)
int day = Integer.parseInt(sign);
ck_name.setMaxAge(60*60*24*day);
ck_pwd.setMaxAge(60*60*24*day);
// 将cookie对象添加到respond中
resp.addCookie(ck_name);
resp.addCookie(ck_pwd);
}
// 4.2.4页面重定向
resp.sendRedirect("page/index.html");
}
}
}
service
public interface AccountService {
Account login(Account account);
}
实现类
public class AccountServiceImpl implements AccountService {
private AccountDao dao;
public AccountServiceImpl(){
dao = new AccountDaoImpl();
}
@Override
public Account login(Account account) {
return dao.login(account);
}
}
dao
public interface AccountDao {
Account login(Account account);
}
实现类
public class AccountDaoImpl implements AccountDao {
private DBTool dbt;
@Override
public Account login(Account account) {
// 准备SQL语句
String sql = "select uid,uname,pwd,rid from account where uname=? and pwd=?";
// 准备数据容器
Account a = null;
// 实例化dbt对象
dbt = new DBTool();
// 调用方法
try{
ResultSet rs = dbt.query(sql,account.getUname(),account.getPwd());
System.out.println(rs.toString());
if (rs.next()){
a = new Account(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getInt(4));
}
}catch (SQLException e){
e.printStackTrace();
}
// 关闭资源
dbt.close();
// 返回结果
return a;
}
}
entity:实体类 Account
util:工具类 关于数据库
(我的数据库是MySQL 8)
db.properties
DRIVER=com.mysql.cj.jdbc.Driver
URL=jdbc:mysql://localhost/test?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
USERNAME=数据库用户名
PASSWORD=数据库密码
public class DBConfig {
// 实例化一个静态的读取属性文件的对象
private static Properties prop = new Properties();
// 静态代码块加载属性文件
static {
try {
prop.load(DBConfig.class.getResourceAsStream("db.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
// 将属性文件中的各个属性封装到静态常量中
public static final String DRIVER = prop.getProperty("DRIVER");
public static final String URL = prop.getProperty("URL");
public static final String USERNAME = prop.getProperty("USERNAME");
public static final String PASSWORD = prop.getProperty("PASSWORD");
}
public class DBTool {
private Connection conn;
private Statement stat;
private PreparedStatement prep;
public DBTool() {
// 连接数据库:
try {
// 反射加载驱动
Class.forName(DBConfig.DRIVER);
// 建立连接
conn = DriverManager.getConnection(DBConfig.URL, DBConfig.USERNAME, DBConfig.PASSWORD);
} catch (Exception e) {
e.printStackTrace();
}
}
// 执行增删改方法
public int update(String sql) throws SQLException {
// 实例化一个statement对象
stat = conn.createStatement();
// 执行SQL语句
int temp = stat.executeUpdate(sql);
// 返回结果
return temp;
}
// 重载增删改(包含问号占位符时)
public int update(String sql, Object... arg) throws SQLException {
prep = conn.prepareStatement(sql);
for (int i = 1; i <= arg.length; i++) {
prep.setObject(i, arg[i-1]);
}
int temp = prep.executeUpdate();
return temp;
}
// 查询
public ResultSet query(String sql) throws SQLException {
stat = conn.createStatement();
ResultSet rs = stat.executeQuery(sql);
return rs;
}
// 查询重载
public ResultSet query(String sql, Object... arg) throws SQLException {
prep = conn.prepareStatement(sql);
for (int i = 1; i <= arg.length; i++) {
prep.setObject(i, arg[i-1]);
}
ResultSet rs = prep.executeQuery();
return rs;
}
// 关闭资源:先开后关
public void close() {
try {
if (stat != null && !stat.isClosed()) {
stat.close();
}
if (prep!=null&& !prep.isClosed()){
prep.close();
}
if (conn!=null&& !conn.isClosed()){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
可能遇到的问题:!!!
tomcat乱码
html乱码(记得清除一下浏览器缓存!!!)