大家都知道Struts是一种基于MVC的结构,而这个MVC又怎么样理解呢?书上阐述的一般都很详细,而我的理解很直白,我们可以把业务逻辑放到每个JSP页面中,当你访问一个JSP页面的时候,就可以看到业务逻辑得到的结果,而把这些业务逻辑与HTML代码夹杂到了一起,一定会造成一些不必要的麻烦,可以不可以不让我们的业务逻辑和那些HTML代码夹杂到一起呢?多少得搀杂一些,那干脆,尽量少的吧,于是我们可以尝试着把业务逻辑的运算过程放到一个Action里,我们访问这个Action,之后Action执行业务逻辑,最后把业务逻辑的结果放到request中,并将页面请求转发给一个用于显示结果的jsp页面,这样,这个页面就可以少去很多的业务逻辑,而只是单纯的去显示一些业务逻辑计算结果的页面而已。这时的Action称为控制器,JSP页可以叫做视图了,而控制器操作的业务对象,无非就应该叫模型了!
从上面的话,我们来分析一下当我们要做一个分页时所需要的部分,而在这之前,我们先看看他们的执行过程吧,首先我们第一次请求访问一个页面,它会把所有记录的前N条显示给我们,之后计算是否有下一页,等类似的信息,当我们点下一页的时候,就获取下一页的信息,我们还可以添加一个搜索,比如我们用于显示学生的,可以安学生姓名查找,学号查找,班级查找。而对于显示的对象,我们一般也都会封装为javabean,所以用于放置查询结果的容器是不定的,而这时,我们就需要用泛型来提升我们的代码效率!
首先我们写一个用于分页显示的javabean:
package com.boya.subject.model;
import java.util.Vector;
public class Page<E>
{
private int current = 1; //当前页
private int total = 0; //总记录数
private int pages = 0; //总页数
private int each = 5; //每页显示
private int start = 0; //每页显示的开始记录数
private int end = 0; //每页显示的结束记录数
private boolean next = false; //是否有下一页
private boolean previous = false; //是否有上一页
private Vector<E> v = null; //存放查询结果的容器
public Page( Vector<E> v ,int per)
{
this.v = v;
each = per;
total = v.size(); //容器的大小就是总的记录数
if ( total % each == 0 )
pages = total / each; //计算总页数
else
pages = total / each + 1;
if ( current >= pages )
{
next = false;
}
else
{
next = true;
}
if ( total < each )
{
start = 0;
end = total;
}
else
{
start = 0;
end = each;
}
}
public int getCurrent()
{
return current;
}
public void setCurrent( int current )
{
this.current = current;
}
public int getEach()
{
return each;
}
public void setEach( int each )
{
this.each = each;
}
public boolean isNext()
{
return next;
}
public void setNext( boolean next )
{
this.next = next;
}
public boolean isPrevious()
{
return previous;
}
public void setPrevious( boolean previous )
{
this.previous = previous;
}
public int getEnd()
{
return end;
}
public int getPages()
{
return pages;
}
public int getStart()
{
return start;
}
public int getTotal()
{
return total;
}
//获取下一页的对象们
public Vector<E> getNextPage()
{
current = current + 1;
if ( (current - 1) > 0 )
{
previous = true;
}
else
{
previous = false;
}
if ( current >= pages )
{
next = false;
}
else
{
next = true;
}
Vector<E> os = gets();
return os;
}
//获取上一页
public Vector<E> getPreviouspage()
{
current = current - 1;
if ( current == 0 )
{
current = 1;
}
if ( current >= pages )
{
next = false;
}
else
{
next = true;
}
if ( (current - 1) > 0 )
{
previous = true;
}
else
{
previous = false;
}
Vector<E> os = gets();
return os;
}
//一开始获取的
public Vector<E> gets()
{
if ( current * each < total )
{
end = current * each;
start = end - each;
}
else
{
end = total;
start = each * (pages - 1);
}
Vector<E> gets = new Vector<E>();
for ( int i = start; i < end; i++ )
{
E o = v.get( i );
gets.add( o );
}
return gets;
}
}
而对于按不同搜索,我们需要一个FormBean,一般的搜索,都是模糊搜索,搜索个大概,而且输入的信息中文的比重也会很大,所以,我把对中文字符的转换放到了这个BEAN里,在进行select * from * where like这样的查询时,如果是like ''这样就可以得到所有的记录了,我便用这个来对付没有输入查询关键字的情况,而like '%*%'可以匹配关键字,而%%也在这里添加上了!
package com.boya.subject.view;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class SearchForm extends ActionForm
{
private static final long serialVersionUID = 1L;
private String key;
private String from;
public String getFrom()
{
return from;
}
public void setFrom( String from )
{
this.from = from;
}
public void reset( ActionMapping mapping, HttpServletRequest req )
{
this.key = null;
}
public String getKey()
{
return key;
}
public void setKey( String key )
{
try
{
key = new String( key.getBytes( "iso-8859-1" ), "gb2312" );
}
catch ( UnsupportedEncodingException e )
{
e.printStackTrace();
}
this.key = "%" + key + "%";
}
public String getAny(){
return "%%";
}
}
前期都做好了,我现在就要开始访问这个Action了,可是这个控制器还没写呢!这里是代码
public class AdminUserAction extends AdminAction
{
private Vector<Student> ss; //用来装结果的容器
private Page<Student> ps; //分页显示的PAGE对象
protected ActionForward executeAction( ActionMapping mapping,
ActionForm form, HttpServletRequest req, HttpServletResponse res )
throws Exception
{
if ( !isSupper( req ) )
{
return notSupper( res );//如果不是超级管理员怎么办?
}
Service service = getService();//获取业务逻辑
SearchForm sf = (SearchForm) form;//获取搜索FORM
String op = req.getParameter( "op" );//获取用户对页面的操作
String search = req.getParameter( "search" );//是否执行了搜索
Vector<Student> temp = null; //用于存放临时反馈给用户的结果容器
if ( op == null )//如果用户没有执行上/下一页的操作
{
if ( search != null )//用户如果执行了搜索
{
if ( sf.getFrom().equalsIgnoreCase( "class" ) )//如果是按班级查找
{
ss = service.getAllStudentBySchoolClassForAdmin( sf
.getKey() );//获取from的关键字
}
else if ( sf.getFrom().equalsIgnoreCase( "name" ) )//如果是按姓名查找
{
ss = service.getAllStudentByNameForAdmin( sf
.getKey() );
}
else if ( sf.getFrom().equalsIgnoreCase( "user" ) )//如果是按用户名查找
{
ss = service.getAllStudentByUserForAdmin( sf
.getKey() );
}
else
{
ss = service.getAllStudentBySnForAdmin( sf.getKey() );//按学号查找
}
form.reset( mapping, req );//重置搜索表单
}
else
{
ss = service.getAllStudentForAdmin( sf.getAny() ); //用户未执行查找就显示全部,
}
if ( ss != null && ss.size() != 0 )//如果查找不为空,有记录,那就创建一个分页对象
{
ps = new Page<Student>( ss, 10 );//将查询结果和每页显示记录数作为参数构件对象
temp = ps.gets();//并获取第一页
}
}
else//如果用户执行了操作
{
if ( op.equals( "next" ) )//操作是下一页
{
temp = ps.getNextPage();
}
if ( op.equals( "previous" ) )//操作是上一页
{
temp = ps.getPreviouspage();
}
}
req.setAttribute( "search", SelectUtil.studentSearch() );//把搜索用到的表单放到request中
req.setAttribute( "students", temp );//该页显示的学生
req.setAttribute( "page", ps );//分页对象
return mapping.findForward( "student" );//请求转发
}
}
用到SelectUtil中的代码如下:
/**
* 获取学生查找类别的select
* @return 学生查找类别
* 2006-5-17 9:06:12
*/
public static Vector<LabelValueBean> studentSearch()
{
Vector<LabelValueBean> s = new Vector<LabelValueBean>();
s.add( new LabelValueBean( "按学号查找", "sn" ) );
s.add( new LabelValueBean( "按班级查找", "class" ) );
s.add( new LabelValueBean( "按姓名查找", "name" ) );
s.add( new LabelValueBean( "按用户查找", "user" ) );
return s;
}
在看页面视图前先让我们看看Model吧,
public class Student extends User
{
private String sn;
private SchoolClass schoolClass; //这里的班级做为了一种对象,我们在视图显示的时候就有了一层嵌套
public SchoolClass getSchoolClass()
{
return schoolClass;
}
public void setSchoolClass( SchoolClass schoolClass )
{
this.schoolClass = schoolClass;
}
public String getSn()
{
return sn;
}
public void setSn( String sn )
{
this.sn = sn;
}
public String getType()
{
return "student";
}
}
在了解了model后,还是看看视图吧,
先放个查询表单:
<html:javascript dynamicJavascript="true" staticJavascript="true" formName="SearchForm" />
<html:form action="/adminUser.do?search=true" onsubmit="return validateSearchForm(this)">
<html:select property="from" >
<html:options collection="search" property="value" labelProperty="label" />
</html:select>
<html:text property="key" size="16" maxlength="16"/>
<html:image src="images/search.gif"/>
</html:form>
由于模型中有嵌套,那么我们就将用到Nested标签,其实没有嵌套也可以使用这个标签,下面的是用于显示信息的,用迭迨器进行遍历request范围的students,你不安排范围,他会自动找到的,并把每次遍历的对象起名叫student,并作为层次的根元素,
<logic:iterate id="student" name="students">
<nested:root name="student">
<nested:nest property="schoolClass"><nested:write property="schoolClass"/></nested:nest>//寻找了student的schoolClass属性对象的schoolClass嵌套
<nested:write property="name"/> //student的名字
<nested:link page="/adminActions.do?method=deleteStudent" paramId="id" paramProperty="id" onclick="return window.confirm('您真的要删除吗?')">删除</nested:link>
</nested:root>
这里是显示分页对象的:
第<bean:write name="page" property="current" />页
共<bean:write name="page" property="pages" />页
//上一页是否存在
<logic:equal name="page" property="previous" value="true">
<html:link page="/adminUser.do?part=student&op=previous">
<font color="6795b4">上一页</font>
</html:link>
</logic:equal>
<logic:notEqual name="page" property="previous" value="true">上一页 </logic:notEqual>
//下一页是否存在
<logic:equal name="page" property="next" value="true">
<html:link page="/adminUser.do?part=student&op=next">
<font color="6795b4">下一页</font>
</html:link> </logic:equal>
<logic:notEqual name="page" property="next" value="true">下一页 </logic:notEqual>
共有<bean:write name="page" property="total" />条数据
</logic:iterate>
到这里不知道您看明白了多少,在我的这个JSP页里几乎没有任何的业务逻辑,这样的设计就比把HTML和JAVA搀杂在一起好了很多
分享到:
相关推荐
Struts2是一个强大的Java web应用程序框架,它提供了一种组织MVC(模型-视图-控制器)架构的方式,使得开发者可以更容易地构建可维护、可扩展的Web应用。jQuery则是一个广泛使用的JavaScript库,简化了DOM操作、事件...
Struts2、Spring和iBatis是Java Web开发中常用的三大框架,它们分别负责MVC模式中的动作控制、依赖注入和数据库操作。本教程将详细讲解如何整合这三大框架,并利用存储过程实现分页功能。 首先,让我们了解这三个...
以下是一些关于Struts分页的关键知识点: 1. **Action类**:在Struts框架中,业务逻辑通常由Action类处理。在分页场景下,Action类会接收用户的请求参数(如当前页数)并调用相应的服务层方法获取分页数据。 2. **...
Struts2分页是Web开发中的一个重要概念,它主要用于处理大量数据时,避免一次性加载所有数据导致页面响应慢或者浏览器崩溃。在这个场景中,我们提到的是使用自定义标签实现类似于百度分页的效果,这是一种常见的用户...
Struts2、Spring和MyBatis是Java Web开发中的三个重要框架,它们分别负责MVC模式中的动作控制、依赖注入和服务层数据操作。本部分将详细介绍这三个框架在2.3.15.3、3.2.4和3.2.3版本中的分页查询功能。 Struts2作为...
通过上述步骤,我们可以实现一个高效、简洁且可重用的Struts分页功能。这种分页方式不仅能够有效提高系统的响应速度和用户体验,还能够更好地适应不同的开发环境和技术栈。此外,这种方式也更加符合MVC的设计理念,...
Struts2、Spring和MyBatis是Java Web开发中的三个重要框架,它们分别负责MVC模式中的Action控制、依赖注入和服务层数据操作。这个压缩包文件可能是某个项目的一部分,其中包含了一个实现通用分页功能以及使用拦截器...
总的来说,Struts MVC的分页例子涵盖了从数据库查询、业务逻辑处理到用户界面展示的整个流程。通过理解和实现这样的例子,开发者能够更好地掌握Struts框架的使用,以及如何在实际项目中实现高效的分页功能。
在这个实例中,“struts2的mvc 含简单的分页”显然涉及到如何在Struts2框架下实现一个具备分页功能的简单应用。以下是对这个主题的详细说明: **Struts2 MVC框架** MVC模式是软件工程中的一种设计模式,它将应用...
Struts2是一个非常流行的Java Web开发框架,它简化了MVC(模型-视图-控制器)架构的实现,使得开发者可以更高效地构建动态、数据驱动的Web应用程序。而Pager-taglib是Struts2的一个扩展,它提供了一种便捷的方式来...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它被广泛应用于Java Web开发中,提供了灵活的控制层结构,使得开发者能够更好地组织和处理业务逻辑。EasyUI则是一个基于jQuery的前端UI库,它为Web应用提供了丰富...
综上所述,这个项目展示了如何在Struts2、Hibernate和Spring框架下实现一个基本的分页功能,涵盖了从前端交互到后端数据处理的完整流程,是学习和理解Java Web开发中分页实现的一个良好实践案例。
5. **国际化与本地化**:Struts支持多语言环境,购物系统可能包含不同语言版本的提示信息,这可以通过资源文件(如`messages.properties`)来实现。 6. **分页功能**:描述中提到的“分页简单明了”,说明购物系统...
Struts 2.0.12 是一个非常重要的版本,它是Apache Struts框架的一个关键迭代,专注于提供MVC(Model-View-Controller)设计模式的实现,以促进企业级Java Web应用程序的开发。这个框架极大地简化了应用的结构,提高...
Struts2是一个非常流行的Java Web框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在Struts2中,Ajax(异步JavaScript和XML)技术的集成使得前端和后端的数据交互变得更加高效,提高了用户体验。"struts2-...
Struts2是一个基于MVC(Model-View-Controller)设计模式的Web应用框架,它提供了强大的控制层,使得开发者能够更方便地处理HTTP请求和响应。在Struts2中,Action类是业务逻辑的核心,而配置文件(如struts.xml)...
通过这个项目,开发者可以学习到如何在Struts和Hibernate的集成环境下实现分页功能,理解MVC架构下各层的职责,以及如何使用Hibernate进行数据库操作。此外,还能了解到如何在前端展示分页信息,提高用户体验。这是...
根据提供的标题、描述、标签及部分内容,我们可以了解到这篇文章主要探讨的是如何在Struts2与Hibernate框架结合下实现分页功能。接下来将详细解析Struts2与Hibernate如何协作完成这一任务。 ### Struts2与Hibernate...
Struts 是一个经典的Java ...通过以上这些步骤和知识点,我们可以构建一个完整的基于Struts的分页系统,提供高效、用户友好的数据浏览体验。在实际开发中,还可以根据项目需求进行定制和扩展,如添加搜索、排序等功能。
1. **通用性**:AfengPager 可以与各种主流的Java Web框架集成,如Spring MVC、Struts2等,它通过提供统一的API,使得无论使用哪种框架,都能轻松实现分页。 2. **URL参数处理**:该组件支持通过URL参数传递分页...