8.1 简介
mvc: model(模型)、view(视图)、controller(控制器)。
对应: 模型对应JavaBean与dao层,视图对应前端页面,控制器对应servlet。Servlet与JSP页面都可以写Java代码,但是为了易于维护与管理,我们约定,servelt专注于请求处理,与视图的跳转和转发;JSP专注于数据的显示。
8.2功能:
-
Model
业务处理(业务逻辑service)、数据持久层CRUD(DAO)
-
View
展示数据、提供链接发起Servlet请求(a,form,img…)
-
Controller
接收用户请求(request:请求参数,session等等)、交给业务层处理对应代码、控制视图的跳转
8.4 项目分包
- view层:视图层,项目中的界面
- controller层:控制层,获取界面上的数据;将要实现的功能交给业务层处理
- service层作用: 业务层, 功能的实现, 与controller控制层和数据访问层DAO交互, 将对数据库的操作交给DAO数据访问层来处理
- dao层作用: 数据访问层, 用来操作数据库表的数据
- db数据库: 这里指MySQL
- domain 实体包: 存放JavaBean
- tools工具包:存放项目中使用到的工具类
- test测试包: 存放项目功能测试的代码
8.3 应用
8.3.1逻辑:
登录界面--->接收用户登录请求--->处理用户的请求--->交给业务层处理登录业务--->DAO层查询用户名与密码是否正确--->数据库
8.3.2 准备:
- 需要在resources目录下新建文件db.properties
db.properties内容:
driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8&useSSL=true
user = root
pwd = root
- 需要在pojo包下创建实体类
- servlet、service、Dao包都需要相应的内容
8.3.3 所需的项目目录
8.3.4 代码实现:
1).BaseDao:用于处理mysql代码
BaseDao内容:
package com.yun.dao;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Properties;
public class BaseDao {
private static String driver;
private static String url;
private static String user;
private static String pwd;
static {
Properties pro = new Properties();
InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
try {
pro.load(is);
}catch (Exception e){
e.printStackTrace();
}
driver = pro.getProperty("driver");
url = pro.getProperty("url");
user = pro.getProperty("user");
pwd = pro.getProperty("pwd");
}
public static Connection getConnection(){
Connection connection=null;
try {
Class.forName(driver);
connection = DriverManager.getConnection(url,user,pwd);
}catch (Exception e){e.printStackTrace();}
return connection;
}
//公共查询类
public static ResultSet execute(Connection conn, ResultSet res, PreparedStatement pre,String sql,Object[] params) throws Exception{
pre = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pre.setObject(i+1,params[i]);
}
res = pre.executeQuery();
System.out.println(pre.toString());
return res;
}
//公共更新类
public static int execute(Connection conn,PreparedStatement pre,String sql,Object[] params) throws Exception{
pre = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
pre.setObject(i+1,params[i]);
}
int res = pre.executeUpdate();
return res;
}
//关闭连接
public static boolean close(Connection conn,PreparedStatement pre,ResultSet res){
boolean flag = true;
try {
if (conn != null) {
conn.close();
conn=null;
}
}catch (Exception e){
e.printStackTrace();
flag = false;
}
try {
if (pre != null) {
pre.close();
pre=null;
}
}catch (Exception e){
e.printStackTrace();
flag = false;
}
try {
if (res != null) {
res.close();
res=null;
}
}catch (Exception e){
e.printStackTrace();
flag = false;
}
return flag;
}
}
2).UserDao接口与其实现类UserDaoImp
UserDao内容:
import com.yun.pojo.User;
import java.sql.Connection;
import java.util.List;
public interface UserDao {
//获取用户
public User getUser(Connection conn,String userCode,String pwd) throws Exception;
}
UserDaoImp内容:
import com.mysql.jdbc.StringUtils;
import com.yun.dao.BaseDao;
import com.yun.pojo.User;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class UserDaoImp implements UserDao{
@Override
public User getUser(Connection conn, String userCode,String pwd) throws Exception{
PreparedStatement pre =null;
ResultSet res = null;
User user=null;
String sql = "select * from smbms_user where userCode=? and userPassword=?";
Object[] param = {userCode,pwd};
if (conn!=null) {
res = BaseDao.execute(conn, res, pre, sql, param);
if (res.next()){
user = new User();
user.setId(res.getInt("id"));
user.setUserCode(res.getString("userCode"));
user.setUserName(res.getString("userName"));
user.setUserPassword(res.getString("userPassword"));
user.setGender(res.getInt("gender"));
user.setBirthday(res.getDate("birthday"));
user.setPhone(res.getString("phone"));
user.setAddress(res.getString("address"));
user.setUserRole(res.getInt("userRole"));
user.setCreatedBy(res.getInt("createdBy"));
user.setCreationDate(res.getDate("creationDate"));
user.setModifyBy(res.getInt("modifyBy"));
user.setModifyDate(res.getDate("modifyDate"));
}
}
BaseDao.close(null,pre,res);
return user;
}
}
3).UserService接口与UserServiceImp实现类
UserService接口:
package com.yun.service.user;
import com.yun.pojo.User;
import java.util.List;
public interface UserService {
//获取用户
public User login(String userCode,String pwd);
}
UserServiceImp内容:
import com.yun.dao.BaseDao;
import com.yun.dao.user.UserDao;
import com.yun.dao.user.UserDaoImp;
import com.yun.pojo.User;
import com.yun.servlet.user.UserServlet;
import org.junit.Test;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
public class UserServiceImp implements UserService{
private UserDao userDao=null;
public UserServiceImp(){
userDao = new UserDaoImp();
}
@Override
public User login(String userCode, String pwd) {
Connection con = null;
User user = null;
try {
con = BaseDao.getConnection();
user = userDao.getUser(con, userCode,pwd);
}catch (Exception e){
e.printStackTrace();
} finally {
BaseDao.close(con,null,null);
}
return user;
}
}
4).LoginServlet
import com.yun.pojo.User;
import com.yun.service.user.UserService;
import com.yun.service.user.UserServiceImp;
import com.yun.util.Constant;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = null;
UserService userService = new UserServiceImp();
String userCode = req.getParameter("userCode"); //来自前端的密码与账号
String pwd = req.getParameter("userPassword");
user = userService.login(userCode,pwd);
if (user!=null){
req.getSession().setAttribute(Constant.user_session,user);
resp.sendRedirect("jsp/frame.jsp");
}else{
req.setAttribute("error","用户名或密码错误!");
req.getRequestDispatcher("login.jsp").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
值得一提的是,serivice与Dao都是以User开头,但是Servlet却是以login开头的。主要是因为,serivice与Dao是按照对象来划分的数据库操作,而Servlet则是功能上的实现。并且:本例子源于狂神SMBMS项目的登录功能实现。