JSP、Servlet实战:团队开发新闻系统(三)架构简介
jsp、servlet原生就是MVC设计思想。
Controller层是Servlet来充当,JSP充当View的角色,Model是Bean。
程序流程
jsp或者html页面请求servlet,为了代码结构清晰、提高开发效率,提取出service层,service如果需要与数据库打交道可以调用dao层。
- servlet用于请求转发、响应,
- service实现业务逻辑,
- dao用于操作数据库
Dao
如果没有统一的编码规范以及减少代码重复率,还可以抽离BaseDao,每个对应的dao继承BaseDao
BaseDao.java
package cn.edu.bzu.group12.orangenews.dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author pangPython
* 基础的数据库操作
*/
public abstract class BaseDao {
private Connection conn = null;
private Statement stat = null;
public BaseDao(){
try {
this.setConn(getConnection());
this.setStat(conn.createStatement());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//获取数据库连接
private Connection getConnection() throws ClassNotFoundException, SQLException{
final String url = "jdbc:mysql://192.168.50.103:3306/group12";
final String user = "group12";
final String password = "group12";
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection(url,user,password);
}
public Connection getConn() {
return conn;
}
public void setConn(Connection conn) {
this.conn = conn;
}
//查询
public ResultSet Query(String sql) throws SQLException{
return this.stat.executeQuery(sql);
}
//增 insert into table values()
public boolean Insert(String sql){
return false;
}
//删 delete
public boolean Delete(String sql){
return false;
}
//根据id删对象
public int DeleteById(int id){
//delete from table where id = b;
return 0;
}
//改 update table set ''='';
public boolean Update(String sql){
return false;
}
public Statement getStat() {
return stat;
}
public void setStat(Statement stat) {
this.stat = stat;
}
//抽象方法 resultset 转换成 bean 对象类型
abstract Object RS2Obj(ResultSet rs,Object obj) throws SQLException;
}
UserDao.java
package cn.edu.bzu.group12.orangenews.dao;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.log4j.Logger;
import cn.edu.bzu.group12.orangenews.bean.User;
/**
* @author pangPython
* 用户数据库操作
*/
public class UserDao extends BaseDao{
Logger log = Logger.getLogger(UserDao.class) ;
User user = new User();
//插入User到数据库
public int add(User user) {
//insert into user values('pwd','user_name',1,'tel','email');
String sql = "insert into user(pwd,user_name,user_sex,tel,email) values('"+user.getPwd()
+"','"+user.getUser_name()
+"',"+user.getUser_sex()
+",'"+user.getTel()
+"','"+user.getEmail()
+"')";
try {
return this.getStat().executeUpdate(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
public User get(int user_id) throws SQLException{
String sql = "select * from user where user_id = "+user_id;
ResultSet rs = this.getStat().executeQuery(sql);
user.setUser_id(user_id);
while (rs.next()) {
user = (User) RS2Obj(rs, new User());
}
return user;
}
public User getUserByNameAndPwd(String user_name,String user_pwd) throws SQLException{
String sql = "select * from user where user_name = '"+user_name+"' and pwd = '"+user_pwd+"'";
ResultSet rs = this.getStat().executeQuery(sql);
while (rs.next()) {
user = (User) RS2Obj(rs, new User());
}
return user;
}
//继承自BaseDao抽象方法
//把数据库查询的ResultSet转换成User对象
@Override
Object RS2Obj(ResultSet rs, Object obj) throws SQLException {
User user_obj = (User)obj;
user_obj.setUser_id(rs.getInt("user_id"));
user_obj.setUser_name(rs.getString("user_name"));
user_obj.setPwd(rs.getString("pwd"));
user_obj.setEmail(rs.getString("email"));
user_obj.setUser_sex(rs.getInt("user_sex"));
user_obj.setTel(rs.getString("tel"));
return user_obj;
}
// SELECT LAST_INSERT_ID();
public int getLastInsertId(String table_name) throws SQLException{
String sql = "SELECT MAX(user_id) AS user_id FROM USER";
ResultSet rs = this.getStat().executeQuery(sql);
while (rs.next()) {
log.debug("返回了数据库中的结果!");
return rs.getInt("user_id");
}
log.debug("返回了0!");
return 0;
}
//更新用户密码
public boolean UpdatePwd(int user_id, String new_pwd) throws SQLException {
String sql = "update user set pwd = '"+new_pwd+"' where user_id = "+user_id;
if(this.getStat().executeUpdate(sql)>0){
return true;
}
return false;
}
//更新用户信息
public boolean Update(User user) throws SQLException {
String sql = "update user set user_name = '"+user.getUser_name()+"' , user_sex = "+user.getUser_sex()+" , email = '"+user.getEmail()+"' , tel = '"+user.getTel()+"' where user_id = "+user.getUser_id();
log.debug("打印sql信息:"+sql);
if(this.getStat().executeUpdate(sql)>0){
return true;
}
return false;
}
}
Bean
bean是作为数据库表的映射,封装的实体类。设计时最好属性名与数据库表的字段名对应,user表就有一个对应的User.java
Service
service层主要写项目的业务逻辑,并且最好不出现数据库操作
实例化一个dao,在service中调用dao中的基础方法
Servlet
servlet中主要是重写service方法或者可以重写doGet、doPost方法。
实例化一个Service,处理来自用户的请求,接收参数,然后调用Service的方法,实现转发,或者重定向。