继上篇博客
既然我们知道了不使用struts给我们带来这么多弊端,那么下面我们来看看struts是如何封装的,怎么解决我们出现的问题的?
先来说一下struts的基本流程,帮助大家理解下面的代码:
Struts基本简要流程如下:
1、客户端浏览器发出HTTP请求。
2、根据web.xml配置,该请求被FilterDispatcher接收。
3、根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。
4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。
6、返回HTTP响应到客户端浏览器。
示例分析(使用struts)
配置文件web.xml
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
add.jsp
<%@ page language="java" contentType="text/html; charset=GB2312"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>添加页面</title>
</head>
<body>
<center>
<s:form action="grade">
<s:textfield name="grade.USERID" label="用户编号" />
<s:textfield name="grade.USERNAME" label="用户姓名" />
<s:textfield name="grade.CHINESE" label="语文成绩" />
<s:textfield name="grade.MATHS" label="数学成绩" />
<s:textfield name="grade.ENGLISH" label="英语成绩" />
<s:submit value="确定" />
<s:reset value="重置" />
</s:form>
</center>
</body>
</html>
Struts.xml
<package name="book" extends="struts-default">
<action name="grade" class="action.GradeAction">
<result name="show">show.jsp</result>
</action>
<action name="login" class="action.UserAction">
<result name="success">success.jsp</result>
<result name="error">error.jsp</result>
</action>
</package>
GradeAction.java
public class GradeAction {
private Grade grade;
private List<Grade> gradeList;
public Grade getGrade() {
return grade;
}
public void setGrade(Grade grade) {
this.grade = grade;
}
public List<Grade> getGradeList() {
return gradeList;
}
public void setGradeList(List<Grade> gradeList) {
this.gradeList = gradeList;
}
public String execute() throws Exception{
GradeDao gradeDao=new GradeDao();
gradeDao.insertGrade(grade);
ArrayList<Grade> gradeList = (ArrayList) gradeDao.listGrade();
this.setGradeList(gradeList);
return "show";
}
单纯的看,这两套代码(结合上篇博客来看),从代码量上来看,都是完成同样的添加功能,使用struts后,明显代码量减少了许多,而且每个操作完成后的跳转页都配置到了配置文件中,这样给我们系统的维护带来了极大的便利。它相当于从界面到action传递的过程中,是以对象的方式传递的,就不需要我们像之前的操作那样一个字段一个字段的去获取。
当然还有一点,就是struts是如何解决servlet过多的问题的?
Struts.xml
<package name="testlogin2" namespace="/user" extends="struts-default">
<action name="login" class="com.action.LoginAction2" method="doFun">
<result name="success">/success.jsp</result>
<result name="error" type="redirect">/error.jsp</result>
</action>
<!-- 第三种方式 :一个action处理多个请求 如:user/modifyUser
<action name="*User_*" class="com.action.UserManagerAction" method="{1}User">
<result name="success">/{2}.jsp</result>
<result name="error">/error.jsp</result>
</action>-->
<action name="*User" class="com.action.UserManagerAction" method="{1}User">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
public class UserManagerAction extends ActionSupport {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String addUser(){
System.out.println("---------AddUser()-------");
return "success";
}
public String modifyUser(){
System.out.println("---------ModifyUser()-------");
return "success";
}
public String delUser(){
System.out.println("---------DelUser()-------");
return "success";
}
}
与servlet的关系
前面我们说对于Model 2模型来说,Servlet过多,转向频繁,流程,配置等不易集中管理,那么struts与Servlet有什么关系?它怎么就能解决Servlet的这些问题呢?
可以说Struts2本质还是一个Servlet,只是对Servlet进一步的封装罢了
对于解决问题来说:
打个比方:做Web项目,好比建房子。
Servlet好比木材,用一根根的木材搭,也可盖起房子,只是速度慢而已;
Struts2好比是用木材做好的一个房子大概结构,要建房子时,只需把它拿过来,再往其里面添砖加瓦,修修补补,就能很快盖好房子,这要比直接使用Servlet要快得多
以上只是我对struts的简单理解,用一句话概括,struts就是将某些功能进行提取,然后做了一个封装,能让我们更好的使用(框架)。当然对于它的优势还需要我们在以后做项目的过程中慢慢体会!