MVC和分页
一,MVC模式的简介
1.1 MVC概念
首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种设计模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),即为MVC。
它是一种软件设计的典范,最早为Trygve Reenskaug提出,为施乐帕罗奥多研究中心(Xerox PARC)的Smalltalk语言发明的一种软件设计模式。
1.2 MVC模式详解
虽然MVC并不是Java当中独有的,但是现在几乎所有的B/S的架构都采用了MVC框架模式。
- 控制器Controller:控制器即是控制请求的处理逻辑,对请求进行处理,负责请求转发和重定向;
- 视图View:视图即是用户看到并与之交互的界面,比如HTML(静态资源),JSP(动态资源)等等。
- 模型Model:模型代表着一种企业规范,就是业务流程/状态的处理以及业务规则的规定。业务流程的处理过程对其他层来说是不透明的,模型接受的请求,并返回最终的处理结果。业务模型的设计可以说是MVC的核心。
1.3 MVC高级框架应用
MVC模式被广泛用于Java的各种框架中,比如Struts2、springMVC等等都用到了这种思想。
Struts2是基于MVC的轻量级的web应用框架。基于MVC,说明基于Struts2开发的Web应用自然就能实现MVC,也说明Struts2着力于在MVC的各个部分为我们的开发提供相应帮助。
二,JSP开发模型
2.1 JavaWeb经历两个时期
2.1.1 jsp_model_1
JavaWeb早期的模型,它适合小型Web项目,开发成本低!Model1第一代时期,服务器端只有JSP页面,所有的操作都在JSP页面中,连访问数据库的API也在JSP页面中完成。也就是说,所有的东西都耦合在一起,对后期的维护和扩展极为不利。
Model1优化后有所改进,把业务逻辑和数据访问的内容放到了JavaBean(狭义JavaBean:实体类,广义JavaBean:实体类,dao,service,工具类)中,而JSP页面负责显示以及请求调度的工作。虽然第二代比第一代好了些,但还让JSP做了过多的工作,JSP中把视图工作和请求调度(控制器)的工作耦合在一起了。
2.1.2 jsp_model_2
Model2模式已经可以清晰的看到MVC完整的结构了。
JSP:视图层,用来与用户打交道。负责接收数据,以及显示数据给用户;
Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;
JavaBean:模型层,完成具体的业务工作,例如:开启事务、转账等。
小结:这就是javaweb经历的两个时期,JSP Model2适合多人合作开发大型的Web项目,各司其职,互不干涉,有利于开发中的分工,有利于组件的重用。但是,Web项目的开发难度加大,同时对开发人员的技术要求也提高了。
2.2 基于MVC的三层架构的实现
虽然MVC把程序分成三部分,每个部分负责不同的功能,但是这只是逻辑的分离,实际代码并没有真正分离,特别是Model(包括业务、数据访问和实体类、工具类等)部分的代码,为了增强代码的维护性和降低代码耦合性,需要把代码分层管理,于是就有了三层架构:
分别是:web层(表示|界面层)、service层(业务逻辑层)、dao层(数据访问层、持久层)
web层对应MVC中的Servlet和JSP
其他层都属于MVC中的Model
三,分页概述
分页是web应用程序非常重要的一个技术。数据库中的数据可能是成千上万的,不可能把这么多的数据一次性显示在浏览器上面。一般根据每行数据在页面上所占的空间,每页显示若干行,比如一般20行是一个比较理想的显示状态。
3.1 分页实现思路
对于海量的数据查询,需要多少就取多少,显然是最佳的解决方法,假如某个表中有200万条记录,第一页取前20条,第二页取21~40条记录。
select * from 表名 order by id limit 0,20 ;
select * from 表名 order by id limit 20,20;
select * from 表名 order by id limit 40,20;
3.2 分页的代码实现
步骤:
1.确定每页显示的数据数量
2.确定分页显示所需的总页数
3.编写SQL查询语句,实现数据查询
4.在JSP页面中进行分页显示设置
MVC和分页思想的代码展示
此次实现会涉及连接池的内容,具体可参考我前期发表的关于数据库链接池的文章
程序包
dao 持久层接口
dao.impl 持久层实现
service 业务层接口
service.impl 业务层实现
web.servlet 表示层
domain 实体类
utils 工具类
web 目录下方法jsp
public interface StudentDao {
//pageNume 页码,pageSize 页大小
List<Student> findByPage(Integer pageNum, Integer pageSize);
long getCount();
void add(Student stu);
}
public class StudentDaoImpl implements StudentDao {
@Override
public List<Student> findByPage(Integer pageNum, Integer pageSize) {
//limit 0,10 limit10,10 limit 20, 10
try {
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
return qr.query("select * from student order by studentNo limit ?,?",new BeanListHandler<Student>(Student.class),(pageNum-1)*pageSize,pageSize);
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
@Override
public long getCount(){
try {
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
return qr.query("select count(*) from student",new ScalarHandler<>());
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
@Override
public void add(Student stu) {
QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());
try {
qr.update("insert into student values(?,?,?,?,?)",stu.getStudentNo(),stu.getLoginPwd(),stu.getStudentName(),stu.getSex(),stu.getBornDate());
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```javascript
public class Student {
private Integer studentNo;
private String loginPwd;
private String studentName;
private String sex;
private Date bornDate;
public Student() {
}
public Student(Integer studentNo, String loginPwd, String studentName, String sex, Date bornDate) {
this.studentNo = studentNo;
this.loginPwd = loginPwd;
this.studentName = studentName;
this.sex = sex;
this.bornDate = bornDate;
}
public Integer getStudentNo() {
return studentNo;
}
public void setStudentNo(Integer studentNo) {
this.studentNo = studentNo;
}
public String getLoginPwd() {
return loginPwd;
}
public void setLoginPwd(String loginPwd) {
this.loginPwd = loginPwd;
}
public String getStudentName() {
return studentName;
}
public void setStudentName(String studentName) {
this.studentName = studentName;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Date getBornDate() {
return bornDate;
}
public void setBornDate(Date bornDate) {
this.bornDate = bornDate;
}
}
public class PageBean {
private Integer pageNum;
private Integer pageSize;
private Long totalSize;
private Integer pageCount;
private List data;
public PageBean(Integer pageNum, Integer pageSize, Long totalSize, List<T> data) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.totalSize = totalSize;
this.pageCount = (int)(this.totalSize % pageSize ==0 ? this.totalSize/pageSize : this.totalSize/pageSize+1);
this.data = data;
}
public Integer getPageNum() {
return pageNum;
}
public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Long getTotalSize() {
return totalSize;
}
public void setTotalSize(Long totalSize) {
this.totalSize = totalSize;
}
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
public List<T> getData() {
return data;
}
public void setData(List<T> data) {
this.data = data;
}
}
```javascript
public interface StudentService {
PageBean<Student> findByPage(Integer pageNum, Integer pageSize);
}
public class StudentServiceImpl implements StudentService {
@Override
public PageBean<Student> findByPage(Integer pageNum, Integer pageSize) {
StudentDao studentDao=new StudentDaoImpl();
List<Student> data = studentDao.findByPage(pageNum, pageSize);
long totalSize = studentDao.getCount();
PageBean<Student> pageBean=new PageBean<>(pageNum,pageSize,totalSize,data);
return pageBean;
}
}
public class DataSourceUtils {
private static DruidDataSource dataSource;
static {
//加载配置文件
Properties properties=new Properties();
try {
InputStream is=DataSourceUtils.class.getClassLoader().getResourceAsStream("database.properties");
properties.load(is);
dataSource=(DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
e.printStackTrace();
System.out.println("初始化连接池失败");
}
}
public static DataSource getDataSource(){
return dataSource;
}
}
@WebServlet(name = "ListStudentServlet",value = "/liststudent")
public class ListStudentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String pageNum = request.getParameter("pageNum");
String pageSize = request.getParameter("pageSize");
int pageN=0;
int pageS=0;
if(pageNum==null|| pageNum.trim().length()==0){
pageN=1;
}else {
pageN=Integer.parseInt(pageNum);
}
if(pageSize==null||pageSize.trim().length()==0){
pageS=10;
}else {
pageS=Integer.parseInt(pageSize);
}
StudentService studentService=new StudentServiceImpl();
PageBean<Student> pageBean = studentService.findByPage(pageN,pageS);
request.setAttribute("pageBean",pageBean);
request.getRequestDispatcher("/stu.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}