`
yxwang0615
  • 浏览: 566113 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

struts1.2 (二)基于请求驱动的MVC框架

阅读更多
MVC分类:
1.基于请求驱动的MVC框架 例如:struts1.x、struts2.x、webwork;
2.基于事件驱动的MVC框架 例如:JSF;

struts MVC的原理:


一个请求从浏览器发给ActionServlet,ActionServlet通过Struts-config.xml找到对应的Action,ActionForm作数据收集,把表单的所有数据放到Action中,接下来就可以方便的在Action中调用模型层进行CRUD操作了,调用完成之后,Action将ActionForward(该对象封装了跳转的路径等信息)对象返回给ActionServlet,ActionServlet分析ActionForward对象的数据结构,转向到相应的跳转jsp,jsp生成相应的跳转页面返回给浏览器。

配置struts项目的步骤:

1.拷贝struts lib下的所有jar到WEB-INF/lib下。

2.修改web.xml文件,插入如下代码:
<!-- Standard Action Servlet Configuration (with debugging) -->
  <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>//struts 日志输出的等级
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>2</param-value> // 日志输出的等级
    </init-param>
    <load-on-startup>2</load-on-startup>//让tomcat一启动就初始化
  </servlet>


  <!-- Standard Action Servlet Mapping -->
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>//映射servlet接收*.do的请求,所有*.do的请求都会被org.apache.struts.action.ActionServlet接收
  </servlet-mapping> 

3.将struts-config.xml拷贝到WEB-INF下
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>
//在这里添加内容,受struts-config_1_2.dtd的约束,其内容的子标签<form-beans>
//必须要放到<action-mappings>的前面才不会报错
</struts-config>

在一个新的web project 中配置好了struts,就可以用它来开发了,
下面是具体的开发步骤:
1.建好jsp页面,xx.jsp  xx_success.jsp  xx_error.jsp  etc.. ;
2.在src/中建立xxxActionForm.java类继承ActionForm类。这样,只要提供相应的属性并生成get和set方法就可以或得表单上的参数,属性要和表单上输入域的名称一致;
3.在src/建立xxxAction.java继承Action,重写Action 的execute()方法;
4.完成struts-config.xml中未完成的内容;

示例程序,用struts1.2 MVC实现登录跳转:

LoginActionForm.java :
package com.wyx.struts;
import org.apache.struts.action.ActionForm;

public class LoginActionForm extends ActionForm{
	
	private String username ;
	
	private String userpass11;
         //表单域上的name是和getXXX方法对应,和定义的私有属性的名字无关
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getUserpass() {
		return userpass;
	}

	public void setUserpass(String userpass) {
		this.userpass11 = userpass;
	}
}


LoginAction.java :
package com.wyx.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;

public class LoginAction extends Action{
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		LoginActionForm laf =(LoginActionForm)form;
		String username = laf.getUsername();
		String userpass = laf.getUserpass();
		//这里为了示例简单并没有调用业务逻辑层的方法
		if(username.equals("admin") && userpass.equals("admin"))
		{        //把用户名放在request中,
                                //登录成功后getAttrbute("username")取出
                           request.setAttrbute("username",username );
			return mapping.findForward("success");
		}else
		{
			return mapping.findForward("error");
		}
	}
}


struts-config.xml :
<struts-config>
	<form-beans>
		<!-- 名字随便起,type是formbean的包名 -->
	   <form-bean name="loginForm" type="com.wyx.struts.LoginActionForm"/>
	</form-beans>
	
	<action-mappings>
		<action path="/user/login" //页面访问的时候必须以这种形式+web.xml配置的中央控制器才能生效.
		forward="success"
		type="com.wyx.struts.LoginAction"//Action的包名
		name="loginForm"//name指定用的哪个ActionForm收集表单的数据,值必须和formbean中name的一致
		scope="request"//struts自动实例化ActionForm,并把它放在scope定义的作用域中,默认session,这里对象用完就不需要了,所以用request合适
		validate="false"	
		>
            //mapping.findForward("success")的跳转
            <forward name="success" path="/login_success.jsp"/>
              //mapping.findForward("error")的跳转   
              <forward name="error" path="/login_error.jsp"/>
      
         </action>
				
	</action-mappings>
</struts-config>

login.jsp:
<!--这里写成*.do的请求方式才能让中央控制器org.apache.struts.action.ActionServlet起拦截起作用-->
<!--struts在分发请求的时候是先用req.getRequestURI()获得去除工程上下文后的部分的请求,然后将.do去掉,剩下"user/login"部分与struts-config.xml中action-mappings标签下的path匹配,找到匹配项之后分发给action-mappings下的那个action标签所对的xxxAction,每个xxaction可以称为业务控制器-->
  <form action="user/login.do" method="post">
    <input type="text" name="username" />
    <input type="password" name="userpass" />
    <input type="submit" value="提交" />
  </form>  
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics