JAVA后台
-
servlet(控制器)
-
service(服务逻辑)
-
dao(数据查询)
-
utils(工具类)
-
entity(实体类Bean)
servlet
控制器、过滤器等
主要用于进行页面数据转发,定向页面
-
配置url
1、通过注释定义路径
@WebServlet("/servletname")
2、通过web.xml
UserServlet
com.igeek.shop.web.servlet.UserServlet
UserServlet
/user
-
Servlet内容
继承HttpServlet
public class UserServlet extends HttpServlet
- 一般只需重写doGet和doPost方法
- url访问方式 - get|post请求
- 在一个方法中调用另一个方法 - 只需在一个方法中可实现所有操作
一个对象对应一个Servlet - 区分不同的操作
例如地址中的method
使用不同关键字,使用“?
”分割:
url?method=login | reg | logout
-
doGet/doPost内容
如果有使用中文的情况记得设置中文参数数据的编码方式
request.setCharacterEncoding("UTF-8");
-
获取请求request参数数据 - 区分不同操作
//以登陆作为示例
String method = request.getParameter("method");
//取出request中method后数据
if("login".equals(method)) { //对数据进行判断以确定其流向
login(request, response);
} else if("reg".equals(method)) {
reg(request, response);
}
-
构造login函数
private UserService userService = new UserService();//定义service类对象
protected void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//2:获取请求request参数数据
//?拼接参数数据 form表单中参数数据
String userAccount = request.getParameter("userAccount");
String password = request.getParameter("password");
//3: 把数据带至数据库端实现数据操作 - 调用Service业务层对应的方法
//System.out.println(userAccount + "\t" + password);
User user = userService.login(userAccount, password);//返回user对象
}
-
Service内容
Service - 业务
- 对象操作方法
- 后台验证(金融、保险...)
- 逻辑处理
- 调用数据库层 - 实现数据具体操作
public class UserService {
private UserDao userDao = new UserDao();//定义数据层对象
public Userlogin(String userAccount, String password) {
//4: 调用Dao数据层 - 实现数据库操作
return userDao.login(userAccount, password);
}
}
-
dao内容
通过调用utils中的工具类,实现对应数据库中数据操作
public class UserDao {
public Userlogin(String userAccount, String password) {
Connection con = DBUtil.getConnection();//工具类utiles中方法--连接数据库
PreparedStatement stmt = null;//初始化查询语句
ResultSet rs = null;
User user = null;
//5: 定义出sql语句
String sql = "select * from user where userName = ? and password = md5(?)";
try {
stmt = con.prepareStatement(sql); //Connection获取语句处理
//若sql中有?参数 - 设置?对应的数据 setType(index, value) index - 从1开始
stmt.setString(1, userAccount);
stmt.setString(2, password);
/*
* 执行ARUD
* executeQuery() - select
* executeUpdate() - insert、 update、 delete
*/
rs = stmt.executeQuery();
/*
* 对查询的结果处理 - 数据封装为对象
* rs.next() - boolean
* rs.getType(index|列名)
*/
if(rs.next()) {
user = new User();
user.setUserId(rs.getInt("userid")); //结果集处理 - 每个列数据封装至对象
user.setUserName(rs.getString(2));
user.setSex(rs.getString("sex"));
user.setEmail(rs.getString("email"));
user.setName(rs.getString("name"));
user.setBirthDay(rs.getDate("birthDay"));
}
} catch (SQLException e) {
e.printStackTrace();
} finally { //关闭数据库相关操作
DBUtil.allClose(rs, stmt, con);
}
return user;
}
}
-
工具类
两种方法
JDBC - API
- 物理连接操作
- 加载数据库驱动jar - 拷贝至WEB-INF/lib中
- 加载驱动程序类
- DriverManager.getConection()
- 关闭相关操作
数据库连接池
public class DBUtil {
private static Connection connection;
//jdbc方法
// public static Connection getConnection() {
// try {
// Class.forName("com.mysql.jdbc.Driver");
// connection = DriverManager.getConnection("jdbc:mysql://192.168.12.2:3306/ebuy",
// "igeek", "igeek");
// } catch (ClassNotFoundException e) {
// e.printStackTrace();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// return connection;
// }
private static DataSource dataSource=null;
static{
dataSource = new ComboPooledDataSource("mysql");
//读取配置文件 - 读取mysql相关配置
}
/**
* 获取数据库连接
* @return
*/
public static Connection getConnection(){
try {
connection = dataSource.getConnection(); //获取连接池中的一个连接
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
/**
* 关闭数据库相关操作
* ResultSet - select查询的结果集
* PreparedStatement - 语句处理 java语句转换为数据库中可执行的sql语句
*/
public static void allClose(ResultSet rs, PreparedStatement stmt, Connection con) {
if(rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
-
entity类(Bean实体)
- Java实体对象 - 表
- JavaBean定义
- private的属性 + setter与getter方法
- 无参构造器
- 实现序列化 - 给定唯一系列化UID
- 网络、文件传递存储对象
public class User implements Serializable {
private static final long serialVersionUID = 1520708863050632827L;
private int userId;
private String userName; //用户名
private String password;
private String sex;
private String email;
private String name; //姓名
private Date birthDay;
//Get和Set方法省略
}
-
Servlet对查询回传数据进行处理
protected void login(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
........
//6:对返回的结果进行处理 - 依据流向 - 跳转至下一个显示页面
if(user == null) { //用户名或密码错误
/*
* 传递页面所需数据
* request - 数据只在下一个页面中使用 - 必须结合forward跳转
* session
* setAttribute("name", value)
*/
request.setAttribute("info", "用户名或密码错误!");
//跳转至下一个url对应的页面
request.getRequestDispatcher("/login.jsp").forward(request, response);
} else {
/*
* 数据在多个页面中使用
* session - 当前用户 - 跨页面数据传递
*/
HttpSession sesison = request.getSession();
sesison.setAttribute("user", user);
//无request传递数据 - 都可以
// request.getRequestDispatcher("/index.jsp").forward(request, response);
response.sendRedirect(request.getServletContext().getContextPath() + "/index.jsp");
// 登陆成功跳转至主页面
}
}
-
页面回收Info信息并显示错误
<%--
%= 对象不存在显示
nullEL表达式显示空
--%>
${requestScope.info}
-
EL表达式
<%-- Jsp注释 - 即可注释java部分也可注释html部分
${内置对象.name}
requestScope
sessionScope - 获取servlet传递的setAttribute的数据
若name的值为基本类型或String - 直接 内置对象.name
若name的值为实体对象 内置对象.name.属性
pageContext - 获取jsp内置对象
${pageContext.request.contextPath} web上下文 /项目名称
--%>
源码:
链接: https://pan.baidu.com/s/17FPGWghph1qkNZiPn_6uIA 密码: teje