学习drp的时候学过model2,相比较model1的jsp+javabean的开发模式,model2是jsp+servlet+javabean,它通过servlet实现控制,获取前端数据、调用业务逻辑并将结果返回到jsp,是MVC框架,servlet就是controler。但是在servlet需要具体指定jsp,如果jsp改名了就要修改程序,,而且它获得的前端数据都是字符串,每次传值后还要转换格式,显然这不是最好的方式,所以今天介绍struts怎么实现的MVC,如何避免这些问题?
一、回顾model2(mvc)
在博客model1和model2的区别 中介绍了model2的开发模式,大家可以去回顾下servlet是如何控制的。
二、通过servlet讲解如何实现MVC
既然对servlet是熟悉的,那就先通过servlet讲解。开始已经说到传统的model2模式存在一些弊端,struts对它做了改进,通过配置文件解耦controler。
1、时序图
这里servlet的功能不再是收集信息调用业务逻辑,它的作用是:截取url,并根据配置文件分发到相应的action。让action去做原本servlet该做的,而且action返回不再是具体的jsp页面。
2、配置文件
web.xml
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>2</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>2</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<!-- Standard Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这里配置所有以.do结尾的action都去读取struts-config.xml配置文件,actionservlet的作用就是时序图中的servlet。
struts-config.xml
<struts-config>
<!-- 配置actionForm -->
<form-beans>
<form-bean name="loginForm" type="com.zx.struts.LoginActionForm" />
</form-beans>
<!-- 配置action -->
<action-mappings>
<action path="/login"
type="com.zx.struts.LoginAction"
name="loginForm"
scope="request">
<forward name="success" path="/login_success.jsp" />
<forward name="error" path="/login_error.jsp" />
</action>
</action-mappings>
</struts-config>
loginForm用来收集表单信息,和页面传过来的一样不用再改格式。path是截取的url,分发到LoginAction,如果成功返回success,定位到成功页面,error定位到失败页面。如果jsp被重命名只需该配置文件即可,不用动程序。所以action和loginform的作用是完成数据收集和业务逻辑调用。
三、struts如何实现
上面讲述的是通过代码直观的表示,struts对它进行的封装。看下面的图:
客户端将请求发到ActionServlet,它截取url,并且通过配置文件分发到具体的action,然后action调用业务逻辑,并返回结果,actionservlet再将结果转发到jsp。
1.loginForm如何工作
/**
* 登录actionForm,负责收集表单数据
* 表单的属性必须和actionform中的get和set的属性一致
* @author zx
*
*/
public class LoginActionForm extends ActionForm {
private String username ;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.loginAction
public class LoginAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf = (LoginActionForm)form;
String username = laf.getUsername();
String password = laf.getPassword();
if("admin".equals(username) && "admin".equals(password)){
//登录成功,struts会new一个actionforward对象把信息放进去
return mapping.findForward("success");
}else{
//登录失败
return mapping.findForward("error");
}
}
execute方法封装了actionform,所以可以直接调用并取值,最后的返回值是字符串和配置文件对应。
四、总结
1、ActionServlet负责截取url和分支,它是一个中央控制器
2、ActionForm会收集表单数据,这样表单数据会自动转换成相应的数据类型,相比model2更灵活
3、Action业务层控制器,也是和模型层打交道的桥梁,和model2的servlet作用一样