注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

 
 
 

日志

 
 

Struts1 框架简介  

2011-08-27 11:23:09|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 Struts1 框架简介
Struts1框架是apache公司的开源子项目,是基于mvc逻辑分层的web层框架实现。是出现最早的web层框架,应用最广发。Struts1框架重点关注的是控制层,对于视图层只是提供了大量的标签;对于model层的影响微乎其微。第十一章Struts1简介 - 皮皮 - 皮皮的小屋
 
Strut1框架的流程详细解释:
1.      客户端发出*.do请求,ActionServlet获取请求,从配置文件中查找path属性与请求名相匹配的Action元素。通过type属性找到用户要请求的Action。总控制器需要检查name属性,如果没有,则将请求直接分发到具体控制器中。
2.      如果name属性存在,根据name属性查找formBean的类型。在查看scope属性,attribute属性。调用 request(session).getAttribute(“attrName”) ,如果返回null,说明在请求域中formBean实例不存在。有总控制创建Formbean ,调用formBean的reset()方法,在将formBean实例绑定到作用域对象中。
再调用formBean的setter()方法,完成参数的封装;在检查validate属性,如果true,则调用formBean的validate()方法进行表单校验。校验通过,则将请求分发到具体action中,将封装了表单参数的formBean实例通过形参传递给action。
Struts1中控制器组件:ActionServlet、Action
其中ActionForm组件用来封装传值,其作用范围局限于视图层和控制层之间使用,不应将ActionForm传递个Model层。ActionForm从本质而言属与model层,ActionForward组件:转发或者重定向对象
ActionMapping组件:辅助组件用来帮助action读取相关的信息。
框架搭建:选择web项目,右键->MyEclipse->Add Struts
Web.xml中内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <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>3</param-value>
    </init-param>
    <init-param>
      <param-name>detail</param-name>
      <param-value>3</param-value>
    </init-param>
    <load-on-startup>0</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Struts-Config.xml配置文件配置单动作控制器与动作控制器:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">
<struts-config>
  <data-sources />
  <form-beans >
  <!-- formbean 元素表示FormBean组件的注册;name属性表示注册名;type属性表示formBean组件的全名 -->
    <form-bean name="loginForm" type="com.bsb.struts.form.LoginForm" />
    <!-- 动态formBean的设置,采取模型驱动封装表单数据 -->
    <form-bean name="studForm" type="org.apache.struts.action.DynaActionForm">
      <form-property name="stud" type="com.bsb.pojo.StudBean" />
    </form-bean>
  </form-beans>
  <global-exceptions />
  <global-forwards >
    <forward name="loginok" path="/form/main.jsp" redirect="true"></forward>
    <forward name="cscheck" path="/cs.do"></forward>
  </global-forwards>
  <action-mappings > 
  <!-- action元素表示控制器的注册;path属性表示控制器的映射名;type属性表示控制器的全名
    name属性表示帮助action封装表单参数的formBean的注册名
    scope属性表示formBean的作用域,默认为session
    attribute属性表示formBean在作用域中的属性名
    validate属性表示formBean封装完表单参数后是否需要进行表单校验,默认为true
    input属性定义用来展示异常信息的页面 --> 

    <action attribute="loginForm"  input="/form/login.jsp"   name="loginForm"
      path="/login"   scope="request"   validate="true"
      type="com.bsb.struts.action.LoginAction" >
         <forward name="loginfail" path="/form/login.jsp"></forward>
      </action>
      <!-- 查询班级的控制器 -->
    <action path="/cs" type="com.bsb.struts.action.CsAction" >
    <forward name="checkcs" path="/form/stud.jsp"></forward>
    </action>   

    <!-- 多动作控制器 parameter属性指定参数名method;此参数method的值就是用户请求的控制器的方法名
    示例: action="/stud.do?method=save" Struts1中多动作控制器不能拥有默认的execute方法 -->
    <action  attribute="studForm" input="/form/stud.jsp"  name="studForm"
      parameter="method"  path="/stud"   scope="request"
      type="com.bsb.struts.action.StudAction">
         <forward name="saveok" path="/form/main.jsp" redirect="true"></forward>
         <forward name="checkstuds" path="/form/show.jsp"></forward>
         <forward name="checkbyid" path="/form/update.jsp"></forward>
         <forward name="updateok" path="/stud.do?method=checkAll"></forward>
      </action>
  </action-mappings>
<!-- 注册struts框架需要使用的资源包ApplicationResources.properties-->
  <message-resources parameter="com.bsb.struts.ApplicationResources" />
</struts-config>

FormBean验证:
public class LoginForm extends ActionForm {
       private String lname;     
       private String lpass;
       private String lid;
public String getLname() {return lname;      }
       public void setLname(String lname) {   this.lname = lname; }
       public String getLpass() {return lpass;  }
       public void setLpass(String lpass) {this.lpass = lpass;  }
       public String getLid() {  return lid;       }
       public void setLid(String lid) {this.lid = lid;   }
       /* validate方法用来验证表单参数的合法性
        * 此方法如果返回null ,或者返回空的ActionErrors
        * 表示验证通过。如果验证失败,总控制器会将流程转发到
        * action元素中input属性指定的页面,展示异常提示信息*/      
       public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
              ActionErrors errs =new ActionErrors();
              if(this.lname.equals("")){                    
                     //创建包含异常提示信息的异常对象
                     ActionError err = new ActionError("error.jsp.name");
                     //将异常对象绑定到异常集合中(map)
                     errs.add("lname", err);
              }
              if(this.lpass.length()<6){
                     ActionError err = new ActionError("error.jsp.pass");                
                     errs.add("lpass", err);
              }
              return errs; //errs通过request传递到input属性指定的页面
       }
       public void reset(ActionMapping mapping, HttpServletRequest request) {
              this.lname="";
              this.lpass="";          }    
}

LoginAction.action: 单动作控制器:
public class LoginAction extends Action {   
       public ActionForward execute(ActionMapping mapping, ActionForm form,
                     HttpServletRequest request, HttpServletResponse response) {
              LoginForm loginForm = (LoginForm) form;//获取封装了表单参数的formBean           
              // 创建javaBean
              LoginBean lb = new LoginBean();        
              //通过BeanUtils辅助类,将formBean的属性值赋值给javaBean
              try {
                     BeanUtils.copyProperties(lb, loginForm);
              } catch (IllegalAccessException e) {
                     e.printStackTrace();
              } catch (InvocationTargetException e) {
                     e.printStackTrace();
              }                         
              //进行登录验证           
              boolean flag =new LoginService().loginValidate(lb);           
              if(flag){
                     return mapping.findForward("loginok");//重定向
              }else{                  
                     ActionErrors errs = new ActionErrors();                   
                     ActionError err = new ActionError("error.user");              
                     errs.add("usererror", err);                   
                     this.saveErrors(request, errs);       //手工将errs绑定到request对象中   
                     //return mapping.findForward("loginfail");
                     return new ActionForward(mapping.getInput());
              }
       }
}

StudAction.action:多动作控制器
public class StudAction extends DispatchAction {      
       public ActionForward save(ActionMapping mapping, ActionForm form,
                     HttpServletRequest request, HttpServletResponse response) {
              DynaActionForm studForm = (DynaActionForm) form;           
              //获取formBean中封装了表单参数的studBean
              StudBean stud = (StudBean) studForm.get("stud");           
              boolean flag = new StudService().saveStud(stud);            
              if(flag){                
                     return mapping.findForward("saveok");                    
              }else{                  
                     return new ActionForward(mapping.getInput());
              }
       }
       public ActionForward update(ActionMapping mapping, ActionForm form,
                     HttpServletRequest request, HttpServletResponse response) {
              DynaActionForm studForm = (DynaActionForm) form;
              // 从动态formBean中获取封装了表单参数的javaBean
              StudBean stud = (StudBean) studForm.get("stud");
              boolean flag = new StudService().updateStud(stud);         
              return mapping.findForward("updateok");
       }
       public ActionForward checkAll(ActionMapping mapping, ActionForm form,
                     HttpServletRequest request, HttpServletResponse response) {
              List studs = new StudService().checkAll();
              request.setAttribute("studs", studs);            
              return mapping.findForward("checkstuds");
       }    
       public ActionForward checkByID(ActionMapping mapping, ActionForm form,
                     HttpServletRequest request, HttpServletResponse response) {
              DynaActionForm studForm = (DynaActionForm) form;
              StudBean stud = (StudBean) studForm.get("stud");           
              stud = new StudService().checkByID(stud.getSid());
              //将封装了学生信息的studBean,绑定到动态formBean中
               studForm.set("stud", stud);               
              List cs = new ClassesService().checkAll();//查班级   
              request.setAttribute("cs", cs);             
              return mapping.findForward("checkbyid");
       }
}

Struts1标签:
Login.jsp
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-template" prefix="template" %>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-nested" prefix="nested" %><html>
       <head><title>JSP for LoginForm form</title></head>
       <body>         
              <html:errors property="usererror" />   
              <html:form action="/login">
                     lname : <html:text property="lname"/><html:errors property="lname"/><br/>
                     lpass : <html:password property="lpass"/><html:errors property="lpass"/><br/>
                     <html:submit/><html:cancel/>
              </html:form>
       </body>
</html>
超链接
<a href="/struts1Test/cs.do">保存学生a</a><br>
      <html:link page="/cs.do">保存学生page</html:link><br>
      <html:link href="/ struts1Test /cs.do">保存学生href</html:link><br>
      <html:link action="/cs">保存学生action</html:link><br>
      <html:link forward="cscheck">保存学生forward</html:link><br>        
      <html:link action="/stud?method=checkAll">查询</html:link>   

迭代标签:  
 <logic:present name="studs">        
           <logic:iterate id="stud" name="studs">     
                  ${stud.sname }${stud.sage }${stud.sexname }${stud.sbirthday }${stud.cname }             
                  <html:link action="/stud?method=checkByID&stud.sid=${stud.sid}">修改</html:link><br>
           </logic:iterate>   
    </logic:present>

添加学生表单:
<html:form action="/stud?method=save">                 
       姓名:<html:text property="stud.sname"></html:text><br>
       年龄:<html:text property="stud.sage"></html:text><br>
       性别:<html:radio property="stud.ssex" value="0">男</html:radio>
              <html:radio property="stud.ssex" value="1">女</html:radio><br>
       生日:<html:text property="stud.sbirthday"></html:text><br>
       班级:<html:select property="stud.cid">
                            <logic:iterate id="c" name="cs">                              
                                   <html:option value="${c.cid}">${c.cname}</html:option>
                            </logic:iterate>                    
                     </html:select><br>              
              <html:submit/><html:cancel/>
</html:form>

修改也学生信息表单
<html:form action="/stud?method=update">              
              <html:hidden property="stud.sid" />
              姓名:<html:text property="stud.sname"></html:text><br>
              年龄:<html:text property="stud.sage"></html:text><br>
              性别:<html:radio property="stud.ssex" value="0">男</html:radio>
                            <html:radio property="stud.ssex" value="1">女</html:radio><br>
              生日:<html:text property="stud.sbirthday"></html:text><br>
              班级:<html:select property="stud.cid">
                            <logic:iterate id="c" name="cs">                              
                                   <html:option value="${c.cid}">${c.cname}</html:option>
                            </logic:iterate>                    
                     </html:select><br>
              <html:submit/><html:cancel/>
</html:form>
  评论这张
 
阅读(952)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018