Struts是如何实现MVC的

上篇文章说到用servlet实现的一些弊端,下面,我们就解决一下这个问题,我们用struts来实现一个登陆的实例。

首先,了解一下struts与MVC的一一对应关系:

Model:The Model portion of an MVC-based system can be often bedivided into two major subsystems -- the internal state of the system and theactions that can be taken to change that state. (from apache softwarefoundation)

Model是由ActionActionForm等构成。Action对象封装了具体的处理逻辑,调用业务逻辑模块,可以用JavaBeanEJB等组件技术来处理数据库的访问,并且把响应提交到合适的View组件中。

View:The View portion of a Struts-based application is mostoften constructed using JavaServer Pages (JSP) technology and PresentationComponents. (from apache software foundation)

View部分是通过JSP技术实现的。Struts还提供了自定义的标记库,通过使用这些自定义标记创建的JSP表单,可以实现和Model部分中的ActionForm的映射,完成对用户数据的封装。

 Controller: ActionServlet and ActionMapping

Controller功能由ActionServletActionMapping对象构成,核心是ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。

 

用一个图简单说明一下struts:



同时,这里是一般struts的调用流程:


我们根据这个流程来实现一下用户登录功能:

 

在这里,有一个非常重要的配置就是struts-config

	<form-beans>
		<form-bean name="loginForm" type="com.bjpowernode.struts.LoginActionForm"/>
			
	</form-beans>
	<action-mappings>
		<action path="/login"
				type="com.bjpowernode.struts.LoginAction"
				name="loginForm"
				scope="request"
				>
			<forward name="success" path="/login_success.jsp"></forward>		
			<forward name="error" path="/login_error.jsp"></forward>
		</action>
	</action-mappings>

Web的配置:
   <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>

LoginAction类:

 package com.bjpowernode.struts;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

/**
 * 登陆Action
 * 负责取得表单数据、调用业务逻辑、返回转向信息
 * @author laner
 *
 */
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)){
			//登陆成功
			return mapping.findForward("success");
		}else{
			//登陆失败
			return mapping.findForward("error");
		}
		
		//return super.execute(mapping, form, request, response);
	}

}

LoginActionForm类,注意表单的属性必须和ActionForm中的get和set的属性一致

package com.bjpowernode.struts;

import org.apache.struts.action.ActionForm;

/*
 * 登陆ActionForm,负责表单数据收集
 * 表单的属性必须和ActionForm中的get和set的属性一致
 * 
 */

public class LoginActionForm extends ActionForm {
	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;
	}
	private String username;
	private String password;
}


同时,看一下我们的表单:

<form action="login.do" method = "post">
		用户名:<input type = "text" name ="username"><br>
		密     码:<input type ="text" name="password"><br>
		<input type ="submit" value="登陆"><br>
	</form>

这样,基本上就完成了,而且解决了之前遗留的问题,但是我们仅仅做出来是不够的,我们需要明白他的大概工作原理,下面用一张时序图来表述一下利用struts的大概调用关系



 

所以,当我们一步步调用的时候,就发现我们之前servlet中写的其实就是一个简易的struts,他把我们认为很繁琐的东西进行了抽象与封装,但是在使用struts框架时,因为他必须符合多种情况,所以让我们的系统做了很多对当前功能来说无用的判断,所以,sturts并不能提高程序运行的效率,相反,它反而降低了效率,但是,它使开发效率和维护效率大大增加了,这也就是使用框架的好处之一。



  • 6
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值