第3章 jsp系统开发模型

第3章 系统开发模型

3.1.1 纯jsp

3.1.2 jsp+javaBean的Model1

广义的javaBean分为数据承载Bean和业务处理Bean

狭义的javaBean,需要满足javaBean规范。

  • public 修饰
  • 实现Serializable接口
  • 无参构造器
  • 成员变量私有化,且提供getter和setter

3.1.3 MVC的Modle2

3.1.4 三层架构

View层:视图层、表现层、Web层。

Service层:业务层、逻辑层。

Dao层:持久层、数据访问层。data access object

三层架构的设计中,采用面向抽象编程。即上层对下层的调用,是通过调用接口的方法实现的。而下层对上层真正的服务提供者,是下层接口的实现类。

提供报务的接口相同,服务的实现类可以更换,实现了层间解耦。

3.1.5 MVC+三层架构

View Level:Contoller(Servlet) + View(jsp)

Service Level:Interfaces + Impls

Dao Level:Interfaces + Impls

将MVC的Model分为了两层:Service层与Dao层,分别用于处理业务逻辑和持久化操作。

3.2 学生注册登录系统

package: com.test.beans

//定义狭义的javaBean Student

public class Sdudent implements Serializable {

    private static final long serialVersionUID = 1L;
    private Integer id;//业务无关主键
    private String password;
    private String num;//学号
    private String name;
    private String age;
    private double score;
    public Sdudent() {
        super();
    }
    public Sdudent(String num, String name, String age, double score) {
        super();
        this.num = num;
        this.name = name;
        this.age = age;
        this.score = score;
    }
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    public double getScore() {
        return score;
    }
    public void setScore(double score) {
        this.score = score;
    }
    @Override
    public String toString() {
        return "Sdudent [id=" + id + ", password=" + password + ", num=" + num + ", name=" + name + ", age=" + age
                + ", score=" + score + "]";
    }

}

建表sdudent

//login.jsp 修改欢迎页面为login.jsp

<form action="${pageContext.request.contextPath }/loginServlet">
    学号:<input type="text" name="num" />
    密码:<input type="text" name="password" />
    <input type="submit" value="登录" />
</form>
<a href="${pageContext.request.contextPath}/register.jsp">注册</a>

//register.jsp

${message }<br />
<form action="${pageContext.request.contextPath }/registerServlet">
    学号:<input type="text" name="num" />
    密码:<input type="text" name="password" />
    <input type="submit" value="登录" />
</form>

//连接数据库,工具类

package com.test.utils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcUtils {
    //加载DB驱动
    static {
        //将驱动mysql-connector-java-5.1.7-bin.jar放到lib下
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    private static Connection conn;        

    //获取connection对象
    public static Connection getConnection() throws SQLException {

        String url = "jdbc:mysql://127.0.0.1:3306/test";
        String user = "root";
        String password = "";
        if(conn == null || conn.isClosed()) {
            conn = DriverManager.getConnection(url, user, password);
        }
        return conn;

    }

    //关闭资源
    public static void close(Connection conn, Statement stmt, ResultSet rs) throws SQLException {

        if(conn != null && !conn.isClosed()) {
            conn.close();
        }
        if(stmt != null && !stmt.isClosed()) {
            stmt.close();
        }
        if(rs != null && !rs.isClosed()) {
            rs.close();
        }

    }

}

//登录的servlet

package com.test.servlets;

public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1、接收请求参数
        String num = request.getParameter("num");
        String password = request.getParameter("password");

        HttpSession session = request.getSession();

        if(num == null || "".equals(num.trim())) {
            session.setAttribute("message", "输入不能为空");
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return;
        }

        //2、创建Service对象
        IStudentService service = new StudentServiceImpl();

        //3、调用Service对象的checkUser验证方法
        Student sdudent = service.checkUser(num, password);

        //4、验证失败,跳转到登录页面
        if(sdudent == null) {
            session.setAttribute("message", "输入错误");
            response.sendRedirect(request.getContextPath() + "/login.jsp");
            return;
        }

        //5、验证通过,跳转到index.jsp
        response.sendRedirect(request.getContextPath() + "/index.jsp");

    }
}

//注册的servlet

package com.test.servlets;
public class RegisterServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        //1、获取表单参数
        request.setCharacterEncoding("UTF-8");
        String num = request.getParameter("num");
        String password = request.getParameter("password");
        String name = request.getParameter("name");
        String ageStr = request.getParameter("age");
        String scoreStr = request.getParameter("score");

        Integer age = Integer.valueOf(ageStr);
        Double score = Double.valueOf(scoreStr);

        //2、创建Student对象
        Student student = new Student(num,name,age,score);
        student.setPassword(password);

        //3、创建Service对象
        IStudentService service = new StudentServiceImpl();

        //4、调用Service对象的saveStudent()方法,写入DB
        Integer id = service.saveStudent(student);

        //5、写入失败,跳转到注册页面,重新注册
        if(id == null) {
            response.sendRedirect(request.getContextPath() + "/register.jsp");
        }

        //6、写入成功,跳转到登录页面
        response.sendRedirect(request.getContextPath() + "/login.jsp");
    }

}

service层

//服务层接口

package com.test.service;

import com.test.beans.Student;

public interface IStudentService {
    //对登录用户进行验证
    Student checkUser(String num, String password);

    //向DB中添加Student
    Integer saveStudent(Student student);
}

//服务层实现类

package com.test.service;

import com.test.beans.Student;
import com.test.dao.IStudentDao;
import com.test.dao.SdudentDaoImpl;

public class StudentServiceImpl implements IStudentService {
    private IStudentDao dao;

    public StudentServiceImpl() {
        dao = new SdudentDaoImpl();
    }

    @Override
    public Student checkUser(String num, String password) {
        return dao.selectStudentLogin(num,password);
    }

    @Override
    public Integer saveStudent(Student student) {
        return dao.insertStudent(student);
    }

}

//dao层

//dao层接口

package com.test.dao;

import com.test.beans.Student;

public interface IStudentDao {

    Student selectStudentLogin(String num, String password);

    Integer insertStudent(Student student);

}

//dao层实现类

package com.test.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.test.beans.Student;
import com.test.utils.JdbcUtils;

public class SdudentDaoImpl implements IStudentDao {
    private Connection conn;
    private Statement stmt;
    private PreparedStatement ps;
    private ResultSet rs;

    @Override
    public Student selectStudentLogin(String num, String password) {
        Student student = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "select * from student where num=? and password=?";
            ps = conn.prepareStatement(sql);
            ps.setString(1, num);
            ps.setString(2, password);
            rs = ps.executeQuery();
            if(rs.next()) {
                student = new Student();
                student.setId(rs.getInt("id"));
                student.setNum(rs.getString("num"));
                student.setPassword(rs.getString("password"));
                student.setName(rs.getString("name"));
                student.setAge(rs.getInt("age"));
                student.setScore(rs.getDouble("score"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                JdbcUtils.close(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return student;
    }

    @Override
    public Integer insertStudent(Student student) {
        Integer id = null;
        try {
            conn = JdbcUtils.getConnection();
            String sql = "insert into student(num,password,name,age,score) values(?,?,?,?,?)";
            ps = conn.prepareStatement(sql);
            ps.setString(1, student.getNum());
            ps.setString(2, student.getPassword());
            ps.setString(3, student.getName());
            ps.setInt(4, student.getAge());
            ps.setDouble(5, student.getScore());

            ps.executeUpdate();

            sql = "select @@identity newId";
            ps = conn.prepareStatement(sql);
            rs = ps.executeQuery();
            if(rs.next()) {
                id = rs.getInt("newId");
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                JdbcUtils.close(conn, ps, rs);
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return id;
    }

}