Struts FAQ

本文是转载文章,文章来源于http://blog.sina.com.cn/s/blog_75a8cfac01012d5m.html,作者皇族小痞痞。如遇版权问题,请及时通知我,删除之。

1. Struts是什么?
答:1) Struts是一个开源框架,用于构建MVC架构Web应用程序;
        2) Struts是Jakarta项目的部分, 由Apache软件基金赞助;
        3) 通过使用Struts,你可在程序中清晰地分隔表现层和业务逻辑层;
        4) 通过提供广泛JSP标签库,Struts也提高了开发效率。标签库解析和验证用户输入、错误处理以及国际化支持。
        5) 我们将会向您展现如何使用Struts开发工具构建Struts的Web应用程序。

2. Struts资源
答:为了学习更多Struts框架有关知识,请关注Struts官方网站以及用户向导:
    . 
http://jakarta.apache.org/struts
    . http://jakarta.apache.org/struts/userGuide/introduction.html

3. MVC(model-view-controller)架构模式
答:1) MVC架构模式在1980年由Smalltalk-80的图形用户界面库的开发者提出;
        2) 从此它在面向对象的用户界面和应用程序控制工具包中得到了广泛地应用,例如Struts,以及经过改良去满足特定平台需求,例如J2EE。
        3) 根据MVC模式,一个软件组件(一个应用程序、一个模块等)应该将它商业逻辑和它的表现层分离;

4. MVC的理由
答:1) 对于相同的model你有超过一个view;
        2) 假如商业逻辑和它的表现层构建在一块,增加额外的view会导致相当大的中断以及增加组件的复杂性;
        3) 一个model有二个view的一个好的例子是一个银行应用程序,它可以通过互联网以及手机访问;
        4) 改变view的时候,你不希望每次改变model;
        5) view依赖于model,它显示给用户model的特定方面;
        6) 将view和model构建在一块,每次当你对view进行细小改动的时候,你不得不改动model;

5. MVC模式
答:这种分离可通过将组件分成以下层达到:
    . model层,实现商业逻辑;
    . view层,实现一个特定客户端类型的用户界面;
    . 有了这二层,我们可实现商业逻辑并且将它呈现给用户。但这只解决了问题的一半,我们应该还能和model交互。这种交互的实现层称为控制层。

6. MVC间的依赖性
答:     
              |ˉˉˉˉˉ|
              | Control |
              |__________|
                  ╱╲ 
                ╱    ╲ 
              ╱        ╲ 
            ↙            ↘ 
      |ˉˉˉˉˉ|      |ˉˉˉˉˉ|
       View   |----->| Model   |
      |__________|      |__________|

7. MVC框架和Struts
答:Struts提供了下面这些组件使用MVC开发应用程序:
    . Model:Struts没有提供model类。这个商业逻辑必须由Web应用程序的开发者以JavaBean或EJB的形式提供;
    . View: Struts提供了action form创建form bean, 用于在controller和view间传输数据;
    此外,Struts提供了自定义JSP标签库,辅助开发者用JSP创建交互式的以表单为基础的应用程序;
    应用程序资源文件保留了一些文本常量和错误消息,可转变为其它语言,可用于JSP中。
    . Controller:Struts提供了一个action serlvet,接收JSP输入字段形成action form,然后调用一个action class。action class提供了model的逻辑接口。

8. Struts Web应用程序中的组件
答:1) 一个servlet,继承自org.apache.struts.action.ActionServlet;
         . 主要实现一个映射功能:将一个请求的URI映射至一个action class;
         . 在调用action class之前,它接收JSP输入字段然后形成form bean;
         . 如果指定了,action servlet也会请求form bean去验证数据;
         . 它然后调用action class完成请求的功能;
         . 假如form bean验证失败,控制然后返回给JSP,以便用户可以改正数据;
         . action servlet由一个XML配置文件配置。这个XML配置文件指定了组件的环境和它们之间的关系。
    2) 多个JSP页面,给终端用户提供界面;
       . Struts提供了广泛的标签库使得JSP开发起来容易;
       . JSP显示了action准备好的信息以及用于用户请求新的信息;
    3) 多个action class,继承自org.apache.struts.action.Action;
       . model的接口;
       . 当一个action完成执行后,它返回一个action转发对象。该对象确定用户界面是否显示响应。
       . action class预备了必须的消息用于显示响应,通常是作为一个form bean,然后使它对JSP页面有用。
       . 用于传送消息给action的form bean,也用于传送响应。但专门的显示数据的view bean的存在也很普遍。
       . 一个action forward包括它的名字、地址(URL)以及一个标记。这个标记指定一个forward或redirect调用是否应该进行。
       . 一个action forward的地址通常硬编码入action servlet的配置文件,但是也可以由action本身动态产生。
    4) 多个action form,继承自org.apache.struts.action.ActionForm。
       . action form是一般的带有set和get方法的javabean;
       . 通常每个Web页面存在一个form bean,但是你也可以使用粗粒度的form bean用于在多个Web页面间保持输入内容。
       . 假如需要进行数据验证,直到form bean成功完成验证,它才会传递至action。
       . 因此form bean可以作为介于JSP和action中的防火墙,它仅允许有效的数据进入系统。
    5) 每种语言一个应用程序资源文件,它包含了一些应用程序文本常量以及错误信息,这使得国际化变得容易。

9. Struts的请求时序
答:1) 来自于Web浏览器的一个请求到达ActionServlet;
    2) 假如处理请求的action有一个相联系的form bean,Struts创建form bean并且将来自于浏览器的输入数据填充它;
    3) 然后调用form bean的验证方法;
    4) 假如验证失败,用户返回至输入页面去改正输入;
    5) 假如验证成功,Struts调用action的execute方法;
    6) action接收到来自于form bean的数据并且执行相应的逻辑;
    7) Action通常调用session EJB处理商业逻辑;
    8) 当商业逻辑处理完,action要么创建一个新的form bean(或其它对应的view bean),要么重用已经存在的用新的数据填充它然后存储于请求(或会话)范围内。
    9) 它然后返回一个forward对象给action servlet,该servlet将其转送至相应的输出JSP页面。
    10)JSP使用form bean中的数据输出结果。

Structs默认使用的是服务器跳转,解析xml->反射调用action.excute->根据结果request.foward(result).

参考:
Structs工作流程:
在web应用启动时就会加载并且初始化ActionServlet,它从structs-config.xml文件中读取配置信息,把它们存放在各种配置对象中。

例如,action的映射信息存放在actionmapping对象中。
当ActionServlet接收到一个请求后:
1。检查和用户请求相匹配的ActionServlet实例。
2。如果ActionForm不存在就创建一个,把客户提交的表单保存到ActionForm对象中。
3。如果需要验证,就调用ActionForm类中Validate()方法。
4。ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action.如果相应的Action不存在,则创建后调用execute()方法。
5。execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象所指向的Jsp页面,生成动态网页返回给客户端。

Struts中基本配置入门

1. 为Struts应用配置Web.xml文件
  第一步:配置ActionServlet
  <servlet>
  <servlet-name>action</servlet-name>
  <servlet-class>org.apache.structs.action.ActionServlet</servlet-class>
  </servlet>


  <servlet-mapping>
  <servlet-name>action</servlet-name>
  <uri-pattern>*.do</url-pattern>
  </servlet-mapping>
  注意:不管应用中包含多少个子应用,都只需配置一个ActionServlet, 因为ActionServlet支持多线程,目前的Structs框架只允许在应用中配置一个ActionServlet。
  第二步:初始化参数对Servlet的运行环境进行初始化配置。
  <servlet>
  <servlet-name> action</servlet-name>
  <servlet-class> org.appache.structs.action.ActionServlet </servlet-class>
  <init-param>
  <param-name>config</param-name>
  <param-value>/WEB-INF/structs-config.xml</param-value>
  </init-param>
  </servlet>
  表2-1. Struts1.1中用到的初始化参数
  参数名       含义/默认值
  config     以相对路径的方式指明Struts应用程序的配置文件位置。如不设置,则默认值为/WEB-INF/struts-config.xml。
  config/sub1   以相对路径的方式指明子应用程序的配置文件位置,一般来说,很少用到子应用程序,在此不多描述。
  debug     设置Servlet的debug级别,控制日志记录的详细程度。默认为0,记录相对最少的日志信息。
  detail      设置Digester的debug级别,Digester是Struts框架所使用的用来解析xml配置文件的一个框架,通过该设置,可以查看不同详细等级的解析日志。默认为 0,记录相对最少的日志信息。
  
  第三步:配置欢迎清单

  当客户访问Web应用时,如果仅仅给出Web应用的Root URL,没用指定具体的文件名,Web容器会自动调用Web应用的欢迎文件。
  <welcome-file-list>
  <welcome-file>welcome.jsp</welcome-file>
  <welcome-file>index.jsp</welcome-file>
  </welcome-fiel-list>
  说明:<welcome-file-list>可以包含多个<welcome-file>子元素,首先查找第一个<welcome-file>文件。
  由于<welcome-file-list>元素中不能配置Servlet映射,因此不能直接把Structs的Action作为欢迎文件,可以采用一种变通的方法来实现。在欢迎文件中调用Structs Action。首先,在Structs配置文件中为被调用的Action创建一个全局的转发项,例如:
  <global-forwards>
  <forward name=”welcome” path=”HelloWord.do”/>
  </global-forwords>
  创建一个welcome.jsp的文件
  最后在web.xml文件中把welcome.jsp文件配置为欢迎文件,代码如下:
  <welcome-file-list>
  <welcome-file>welcome.jsp</welcome-file>
  </welcome-file-list>
  第四步:配置错误处理
  <error-page>
  <error-code>404</error-code>
  <location>/commom/404.jsp</location>
  </error-page>
  <error-page>
  <error-code>505</error-code>
  <location>/commom/505.jsp</location>
  </error-page>
  
  也可以为Web容器捕获的Java异常配置<error-page>,需要设置<exception-type>子元素,它用于指定Java异常类。Web容器可能捕获如下异常:
  RuntimeException或Error  ServletException或它的子类 IOException或它的子类
  <error-page>
  <exception-type>java.io.IOException</exception-type>
  <location>/common/system_ioerror.jsp</location>
  </error-page>
  
  第五步:配置Structs标签库
  使用客户化的标签库,要配置它们
  
  <taglib>
  <tag-uri>/WEB-INF/structs-html.tld<tag-uri>
  <taglib-location>/WEB-INF/structs-html.tld</taglib-location>
  </taglib>
  
  <tag-uri>用于指定标签库的相对或者绝对URI地址,Web应用根据这一URI来访问标签库。
  <taglib-location>指定标签描述文件在文件资源系统中的物理位置。
  
  2.Structs配置文件
  
  Structs框架在启动时会读入其配置文件,根据它来创建和配置各种Structs组件。
  1<Structs-config>元素
  <structs-config>元素是Structs配置文件的根元素,<structs-cofig>元素有8个子元素。它的DTD定义如下:
  <!ELEMENT structs-config(data-sources?,formbean?,global-exeception?,global-forward?,action-mapping,controller?,message-resources*,plug-in*)>
  
  在Struts配置中,必须按照以上的DTD指定的先后顺序来配置<Structs-config>元素的各个子元素,如果颠倒了这些元素的配置文件中的位置,在Structs应用启动时会生成错误。
  
  <data-sources>元素
  <data-sources>元素包含零个、一个或者多个<data-sources>子元素,<data-sources>用于配置特定的数据源,它可以包含多个<set-property>子元素,用于设置数据源的各种属性。  
  配置了数据源后,就可以在Action类中访问数据源,在org.apache.structs.action.Action类中定义了getDataSource(HttpRequrst)方法,它用于获取数据源对象的引用。
  DataSource dataSource;
  Connection connection;
  dataSource =getDataSource(request);
  connection=dataSource.getConnection();
  也可以在配置文件中声明多个数据源,此时需要为每一个数据源分配唯一的key值,通过改值来标识特定的数据源。
  
  <form-beans>元素
  <form-beans>元素用来配置多个ActionForm Bean,<form-beans>包含多个<form-bean>子元素,,每个<from-bean>包含多个属性,ClassName , name,type
  <form-beans>
      <form-bean name="HelloForm" type="hello.HelloForm"/>
  </form-beans>
  注意:配置动态ActionForm Bean,还必须配置<form-bean>元素的<form-property>元素。
  <form-beans>
       <form-bean name="HelloForm" type="hello.HelloForm"/>
      <form-bean name="userForm" type="org.apache.structs.action.DynaActionFrom">
                  <from-property name="firstname" type="java.lang.String"/>
                 <form-property name="secondname" type="java.lang.String">
                 <form-property name="age" type="java.Integer" initial="18">

           </form-bean>
  </form-beans>  
  
  3<global-exception>元素
  <global-exception>用于配置异常处理,<global-exception>元素可以包含零个或者多个<exception>元素。
  <exception>元素用来设置java异常和异常处理类org.apache.structs.action.ExceptionHander之间的映射。
  
  4<gloable-forwards>元素
  <global-forwards>元素用来声明全局的转发关系,<global-forwards>有零个或多个<forward>元素组成。<forward>元素用于把一个逻辑映射到特定的URL
  
  属性      描 述
  
  className  和<forward>元素对应的配置类,默认为org.apache.structs.action.ActionForWard
  
  name     转发路径的逻辑名,此项时必须的
  
  path     指定或者重定向的URI。此项时必须的,必须以”/”开头
  
  redirect   此项是true,表示是执行重定向,此项是false时,表示请求转发。
  
  <global-forwards>
  <forward name="forward1" path="/Action1.do"/>
  <forward name="forward2" path="/Action2.do"/>
  </global-forwards>
  
  如果jsp1.jsp把请求转发给Action1,可以使用以下代码:
  <html:link forward=”forward1”>
  或者<logic:forward name=”forward1”>
  
  如果Action1的execute()方法把请求转发给JSP2.jsp,可以使用一下代码:
  return(mapping.findForward(“forward2”))
  
  5<action-mapping>元素
  
  <action-mapping>元素包含零个或者多个<action>元素。<action>元素描述了从特定的请求路径到相应的Action类的映射。
  6<controller>元素
  <controller>元素用于配置ActionServlet。
  
  7< message-resources>元素
  
  <message-resources>元素用于配置Resource Bundle,Resource Budle用于存放本地化消息文件。
  Structs标签
  HTML标签
  标签名        描述
  base        包装HTML的base元素
  button       包装HTML的 button类型的input元素
  cancel       包装HTML cancel 按钮
  checkbox      包装HTML checkbox 类型的输入域
  errors        有条件地显示一些error消息,显示ActionErrors信息
  file         包装HTML文件上传输入域
  form         定义HTML form 元素
  frame        包装HTML frame 元素
  hidden        包装HTML hidden 输入域
  html         包装 HTML中的 html 元素
  image        包装 "image"类型的输入域
  img         包装HTML的 img 元素
  javascript     包装根据ValidatorPlugIn提供的校验规则所提供的javascript校验脚本
  link         包装超链接
  messages       有条件地显示一些提示信息,显示ActionMessages信息
  multibox       包装多选输入框
  option        包装一个选择输入框
  options       包装一批选择输入框
  optionsCollection  包装一批选择输入框集
  password       包装密文输入框
  radio        包装单选输入框
  reset        包装“重置”功能的按钮
  rewrite       包装一个URL
  select        包装一个选择输入框
  submit        包装一个提交按钮
  text         包装一个文本输入框
  textarea       包装一个备注输入框
  
  ActionForm
  ActionForm 的要求
  创建一个ActionForm 并不困难,但是你的类必须符合一些要求:
  ActionForm 必须扩展自org.apache.struts.ActionForm。基类ActionForm 是不能实例化的。
  ActionForm 必须为每个应该从请求中收集的HTML控件定义一个公共属性。
  (Struts 1.0 要求每个属性都要mutator 和accessor 。Struts 1.1 则没有如此严格)
  ActionForm还可能要符合一些可选的要求:
  如果你要求ActionForm 在传递属性到Action之前校验它们,你就必须实现validate方法;
  
  如果想在组装前初始化属性,必须实现reset , 它在ActionForm 组装前被调用;
  动态ActionForm
  ActionForm 作为类型转换器
  ActionForm的一个强制点是应该使用String 和boolean属性。实际上,这意味着属性必须得从一种转换到另一种类型。

       大部分应用也需要一些属性,比如电话号码或者数量,以一种格式化的方式出现。核心Java 包提供一些工具来做这种事情,

       但是要清楚地将他们集成到应用中仍然是一个挑战。
  
  Struts 开发人员经常在ActionForm中包含helper方法,来进行类型转换。helper 方法可以有很多种实现方式,这我们在5.6种叙述。
  
  5.2.6 ActionForm 作为防火墙
  
  当请求提交时,ActionServlet 使用一个自动组装机制来从请求参数中设置请求的ActionForm属性。这让你可以通过控制哪个ActionForm 属性被暴露来控制哪个请求参数
  
  是可接受的。这也意味着如果你的ActionForm 的粗心设计你可能失去控制哪个参数可以接受的能力。ActionForm 一定不能包含看起来像是一个JavaBean 属性,但不能从 HTTP 请求设置的属性方法。
  
  5.3.4 ActionForm 可以嵌套其它bean
  
  因为Struts 标签扩展和自动组装机制都支持点号语法来从ActionForm访问其它bean。这是一个方便的方式,可以通过ActionForm来组装存在的bean。在JSP 页面, 你可
  
  以象这样引用一个嵌套的bean:
  <html:text propety="values.telephoneText"  size="14" maxlength="14"/>
  
  5.7.2 分发(Dispatch )
  
  Struts 开发人员通常使用同一个Action处理相关的****作。一个通常做法来选择****作是在HTML表单中使用隐藏属性。BaseForm 的dispatch 属性也可用作这个目的:
  public void setDispatch(String dispatch);
  public String getDispatch();
  
  Struts 配置提供连个级别嵌套的ActionForward:
  Global (全局) ActionForward对整个应用中的所有Action 对象均有效;
  Local (局部) ActionForward 则在ActionMapping 元素中定义。仅对那些在这个ActionMapping中调用的Action对象有效。
  从Action 对象内部来看,forward 通常像这样来选择:
  ActionForward forward = mapping.findForward("continue"); 

补充:

struts-config.xml的主要元素及作用如下:

      ·<struts-config>:根元素
      ·<form-beans>:描述一组ActionForm对象
      ·<action-mappings>:描述一组Action对象
      ·<global-forwards>:定义在整个应用程序内可见的全局转发
      ·<data-source>:定义数据源
      ·<global-exception>:定义全局异常
      ·<controller>:用于配置控制类
      ·<message-resources>:用于配置消息资源包
      ·<plug-in>:用于定义添加至Struts应用中的插件

1.<form-beans>元素(用于描述ActionForm对象)
      <form-beans>元素允许配置多个ActionForm类。它可包含零个或多个<form-bean>子元素。
      <form-bean>元素的主要属性如下:
      ·className:可选,指定和<form-bean>元素对应的配置类,默认值为org.apache.struts.config.FormBeanConfig,
自定义的配置类必须扩展该类。
      ·name:指定该ActionForm的唯一标识,Struts框架用该标识来引用这个form bean,该属性必须指定。
      ·type:指定ActionForm的完整类路径和类名,该属性必须指定。
      如果配置了动态ActionForm(DynaActionForm),则还必须配置<form-bean>元素的<form-property>子元素,用来指定表单字段。

2.<action-mappings>元素(用于描述Action对象)
      <action-mappings>元素帮助进行框架内部的流程控制,可将请求URI映射到Action类,将Action对象与ActionForm对象相关联。
      <action-mappings>元素内可以定义多个<action>子元素。<action>元素所描述的是特定的请求路径和一个相应Action类之间的映射关系。Struts控制器会将请求中的URI路径与诸多<action>元素中的path属性相匹配,以选出一个特定的映射。
      <action-mappings>元素的主要属性如下:
      ·attribute:设置和Action关联的forn bean在request/session内的属性key,通过request/session的getAttribute(attribute)方法返回该form bean的实例。
      ·name:指定同该Action关联的form bean的引用标识。
      ·type:指定该Action类的完整类路径和类名。
      ·validate:指定是否调用form bean的validate()方法验证表单的数据,默认为true。
      ·input:指定表单输出页面的URL路径,当表单验证失败时将请求转发到该URL。
      ·scope:指定同该Action类关联的forn bean的存在范围,可选request和session,默认为session。
      ·path:指定Action的访问路径,即该Action在引用中的标识名,以“/”开头。
      <action>元素中可包含零个或多个<forward>子元素,<forward>子元素定义了转发动作,它的主要属性如下所示:
      ·name:指定转向标识名。
      ·path:指定转向标识名所对应的转向页面。
      ·redirect:指定是转发还是重定向。

C语言-光伏MPPT算法:电导增量法扰动观察法+自动全局搜索Plecs最大功率跟踪算法仿真内容概要:本文档主要介绍了一种基于C语言实现的光伏最大功率点跟踪(MPPT)算法,结合电导增量法与扰动观察法,并引入自动全局搜索策略,利用Plecs仿真工具对算法进行建模与仿真验证。文档重点阐述了两种经典MPPT算法的原理、优缺点及其在不同光照和温度条件下的动态响应特性,同时提出一种改进的复合控制策略以提升系统在复杂环境下的跟踪精度与稳定性。通过仿真结果对比分析,验证了所提方法在快速性和准确性方面的优势,适用于光伏发电系统的高效能量转换控制。; 适合人群:具备一定C语言编程基础和电力电子知识背景,从事光伏系统开发、嵌入式控制或新能源技术研发的工程师及高校研究人员;工作年限1-3年的初级至中级研发人员尤为适合。; 使用场景及目标:①掌握电导增量法与扰动观察法在实际光伏系统中的实现机制与切换逻辑;②学习如何在Plecs中搭建MPPT控制系统仿真模型;③实现自动全局搜索以避免传统算法陷入局部峰值问题,提升复杂工况下的最大功率追踪效率;④为光伏逆变器或太阳能充电控制器的算法开发提供技术参考与实现范例。; 阅读建议:建议读者结合文中提供的C语言算法逻辑与Plecs仿真模型同步学习,重点关注算法判断条件、步长调节策略及仿真参数设置。在理解基本原理的基础上,可通过修改光照强度、温度变化曲线等外部扰动因素,进一步测试算法鲁棒性,并尝试将其移植到实际嵌入式平台进行实验验证。
【无人机协同】动态环境下多无人机系统的协同路径规划与防撞研究(Matlab代码实现)​ 内容概要:本文围绕动态环境下多无人机系统的协同路径规划与防撞问题展开研究,提出基于Matlab的仿真代码实现方案。研究重点在于在复杂、动态环境中实现多无人机之间的高效协同飞行与避障,涵盖路径规划算法的设计与优化,确保无人机集群在执行任务过程中能够实时规避静态障碍物与动态冲突,保障飞行安全性与任务效率。文中结合智能优化算法,构建合理的成本目标函数(如路径长度、飞行高度、威胁规避、转弯角度等),并通过Matlab平台进行算法验证与仿真分析,展示多机协同的可行性与有效性。; 适合人群:具备一定Matlab编程基础,从事无人机控制、路径规划、智能优化算法研究的科研人员及研究生。; 使用场景及目标:①应用于灾害救援、军事侦察、区域巡检等多无人机协同任务场景;②目标是掌握多无人机系统在动态环境下的路径规划与防撞机制,提升协同作业能力与自主决策水平;③通过Matlab仿真深入理解协同算法的实现逻辑与参数调优方法。; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注目标函数设计、避障策略实现与多机协同逻辑,配合仿真结果分析算法性能,进一步可尝试引入新型智能算法进行优化改进。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值