Struts個人總結

1,Struts2访问ServletAPI有哪些方式?在Action中如何获取session,request,response。
答:ActionContext对象以解藕的方式访问ServletAPI,ServletActionContext对象以藕合的方式访问ServletAPI。
访问request,session:
(1).ActionContext对象以解藕的方式访问ServletAPI
1)获取对象
ActionContext ctx=ActionContext.getContext();
Map request=(Map)ctx.get("request");
Map session=(Map)ctx.getSession();
2)将数据存储至对象中
request.put("变量","值");
session.put("变量","值");
3)从对象中获取数据
String 变量名=request.get("变量").toString();
String 变量名=session.get("变量").toString();
(2).ServletActionContext对象以藕合的方式访问ServletAPI。
HttpServletRequest requst=ServletActionContext.getRequest();
HttpSession session=ServletActionContext.getRequest().getSession;
HttpServletResponse response=ServletActionContext.getResponse();
ServletContex context=ServletActionContext.getServletContex();

2,详述Struts2如何实现动态方法调用?举例说明。
答:(1).配合javaScript使用。
action="actionName!动态参数.action";
(2).配合Struts2标签库的<s:submit>标签使用。
<s:submit valus="提交" method="动态参数"/>
 注:动态参数即为要执行的方法名。
(3).使用通配符的方式在Struts.xml中配置
<action name="action名字_*" class="包名+类名" method="{1}"></action>
在地址栏输入http://localhost:8080/项目名/action名字_方法名.action

3,详述什么是拦截器,如何自定义拦截器,如何配置拦截器。试举例说明配置。
答:拦截器是动态拦截Action调用的对象。自定义拦截器需要实现Interceptor接口
在struts.xml文件中定义拦截器,拦截器栈:
<package name="my" extends="struts-default" namespace="/manage">
        <interceptors>
        <!-- 定义拦截器 -->
        <interceptor name="拦截器名" class="拦截器实现类"/>
        <!-- 定义拦截器栈 -->
        <interceptor-stack name="拦截器栈名">
             <interceptor-ref name="拦截器一"/>
             <interceptor-ref name="拦截器二"/>
        </interceptor-stack>
        </interceptors>
        ......
</package>

4,Struts2实现文件上传的实现步骤(列出重要步骤)。
答:
1.为表单元素设置“enctype="multipart/form-data"”属性
2.导入文件上传jar包(io,fileupload)
3.在action中添加属性其中file类型的xxx属性,string类型的xxxfileName属性,String类型的xxxContentType属性分别为上传文件的内容、文件名、文件类型是必须设置的属性

5,描述ActionContext、StackContext、ValueStack三个对象之间的关系。
答:ActionContext的结构如下图:
                 |--request 用于访问HttpServletRequest
                 |--application 用于访问ServletContext
   context-------|--ognlValueStack(根对象)
                 |--session 用于访问HttpSession
                 |--attr 用于按page->request->session->application访问其属性
                 |--parameters 用于访问Http的请求参数
ActionContext是Action上下文可以得到request session application
ValueStack是值栈 存放表单中的值
Stack Context 栈上下文 也是用来存值的

6,什么是OGNL表达式,如何使用OGNL表达式。举例说明。
答:OGNL表达式是对象图导航语言,是一个开源项目。在Struts2中使用OGNL表达式需要和Struts标签配合使用,例如<s:property vame='属性名'>。当然也可以用EL表达式访问值栈中的属性,例如${属性名}。访问上下文中的不是根对象属性时需要使用#或者@做前缀(标识命名空间),如#session.属性名或者#session["属性名"] <s:property vame='#session["属性名"]'>,当属性出现特殊字符时使用带[]的方式

7,Struts2标签库可分为哪些?如何导入?
答:表单标签:<%@ taglib uri="/struts-tags" prefix="s"%>
<s:iterator>用于迭代
<s:doubleselect>生成级联下拉元素
<s:token>阻止页面重复提交
非表单标签:<%@ taglib uri="/struts-dojo-tags" prefix="sx"%>
head节点下添加必须标签<sx:head parseContent="true">
<sx:datetimepricker>用于弹出日历选择框
<sx:tree>,<sx:treenode>用于生成树形菜单

1.什么是框架?
  框架,即framework,其实就是某种应用的半成品,是一组可重用组件。
使用成熟的框架,就相当于让框架去完成一些基础工作,开发者只需集中精力完成系统的业务逻辑设计。
框架一般是成熟,稳健的,可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。
另外框架一般都经过大量使用,扩展性好,而且它会不断升级,开发者可直接享受框架升级代码带来的好处。
在好的框架下,开发者只需要写一些必须的代码,他们不需要直接接触底层的API

2.Struts1框架有那些组件,各组件的功能是什么?
 1) ActionServlet:
     核心控制器,用于加载struts-config.xml配置文件,定位Action,
     实例化ActionForm、Action
 2)Action:业务逻辑控制器,用于处理用户的逻辑
 3)ActionForm:用于封装用户提交过来的表单元素
 4)ActionForward:用于关联URL的逻辑名与物理名
 5)ActionMapping:用于映射,查找ActionForward

3.Struts1框架运行流程?
1) 客户端向Web服务器发出*.do的HTTP请求
2) Struts1中的核心控制器ActionServle拦截该请求,并根据用户的请求,在Struts-config.xml配置文件中查找对应的业务逻辑控制器Action ,其中Action 的 name 属性指定了用于封装请求参数的 ActionForm,之后实例化一个ActionForm并把用户请求的参数填充给ActionForm
3) 核心控制器ActionServlet把请求转发给业务逻辑控制器Action
4) Action调用ActionForm取出用户提交的请求参数
5) Action调用JavaBean,并传入用户请求参数给JavaBean以进行处理
6) Action根据JavaBean处理的结果返回一个ActionForward实例,ActionForward对象代表转发页面的逻辑名与物理名之间的关系映射。
7) 根据ActionForward将请求转发到相应的JSP页面。
8) JSP页面调用JavaBean显示数据。JSP 页面在表现之前,还需要调用对应的JavaBean,此处的 JavaBean 不再是包含业务逻辑的 JavaBean,而是封装了处理结果的普通vo (值对象)。JSP 页面根据 vo 的值,利用 JSTL 和Struts 的标签库来生成HTTP 响应给客户端。

4.什么是动态ActionForm
 动态ActionForm(DynaActionform)是struts从1.1版本开始引入一项新的技术,
使用动态Form可以不必创建对应的FormBean 类,
只需在struts-config.xml文件中进行配置,这样减少了编码工作,
也方便修改。Struts1在运行时,
会自动根据struts-config.xml中配置的DynaActionform来生成一个ActionForm实例

5.什么是DispatchAction?
Struts1中的Action是业务逻辑控制器,用于处理单个的业务逻辑。
而DispatchAction是仅次于Action,使用最频繁的Action,它是Action的子类。
通常在一个Action类中只能完成一种业务操作,
如果希望在同一个Action类中完成一组相关的业务操作,
可以使用DispatchAction类。这种情形一般对应于同一个表单中有多个提交按钮,
每个提交按钮执行不同的业务逻辑

6.RequestProcessor与ActionServlet类之间的关系
RequestProcessor 是 Struts 的核心类,而 Struts 的核心控制器是 ActionServlet 。
但ActionServlet 并未完成真正的处理,只是调用 RequestProcessor ,
RequestProcessor 才是Struts 的核心类。同样可根据需要扩展RequestProcessor类。
RequestProcessor类的一个扩展点为processPreprocess()方法。
process()方法在调用Action的execute()方法之前,就会调用processPreprocess()方法,
如果processPreprocess()方法返回true,则表示继续按正常的流程处理请求。
如果在某些条件下希望终止处理请求,
只需让processPreprocess()方法返回false即可

7.什么是Struts1的国际化
 国际化是指应用程序运行时,可根据客户端请求来自的国家/地区、语言的不同而显示不同的界面。例如,如果请求来自于中文操作系统的客户端,则应用程序中的各种标签、错误提示和帮助等都使用中文;如果客户端使用英文操作系统,则应用程序能自动识别,并作出英文的响应。引入国际化的目的是为了提供自适应、更友好的用户界面,而并未改变程序的逻辑功能

8.什么是Struts1的插件
  Struts1框架提供了动态插入和加载组件的功能,这种组件被称为Struts插件。Struts插件实际上就是一个Java类,它在Struts1应用程序启动时被加载,在应用关闭时被销毁。任何作为插件的Java类都应该实现org.apache.struts.action.PlugIn接口,PlugIn接口包括两个方法,代码如下:
public class MyPlugIn implements PlugIn {
 public void destroy() {
  System.out.println("插件正在销毁了....");
 }

 public void init(ActionServlet arg0, ModuleConfig arg1)
   throws ServletException {
  System.out.println("插件正在初始化....");
 }
}

一个Struts应用可以包含一个或多个插件。在Struts应用程序启动时,Struts1框架调用每个插件类的init()方法进行初始化,在插入件的初始化阶段,可以完成一些初始化操作,如建立数据库连接。当应用程序被关闭时,Struts框架就会调用每个插件的destroy()方法,destroy()方法可以用来完成释放资源的任务,如关闭数据库连接等


9.Struts1异常处理开发步骤
 (1)创建自定义异常处理类
 (2)创建模型,在其中定义业务方法,并使用throws 关键字定义方法会抛出异常
 (3)创建Action,把其中的execute方法加上throws Exception 关键字用来抛出异常
 (4)配置全局异常处理元素,来处理Struts1中发生的异常
(6)创建error.jsp页面,做为出现异常后友情提示页面
 
 
10.<html:optionCollections>标签的使用方法
<html:option>标签只能生成<html:select>下拉框的单个下拉项,
<html:optionsCollection>标签可从Web作用域范围内取出集中项,
作为下拉框的下拉框。<html:optionsCollection>标签的使用格式为:
<html:optionsCollection name="name" label="label" property="property" value="value"/>
<html:optionsCollection>标签的各属性意义
属性名 意义
name 指定存储在作用域范围中集合的名字,一般为JavaBean集合
label 指定下拉框中做为显示文本的JavaBean中的某个属性
value 指定下拉框中做为值的JavaBean中的某个属性
property 如果一个JavaBean中的某个属性是一个集合类型,可指定此项

 

11. <bean:write>标签的使用方法
Struts Bean标签库中的标签可以访问已经存在的JavaBean以及它们的属性,还可以定义新的Bean,把它们存放在page范围内或者用户指定的范围内,供页面内其它元素访问。
<bean:write>标签
<bean:write>标签用于在页面上输出某个Bean或它的属性的内容,使用格式为:
<bean:write  name=”name” property=”propertyName”/>
<bean:write>标签各属性的意义
属性名 意义
name 指定存储在作用域范围中集合的名字
property 指定要输出JavaBean中的某个属性
 

12. <logic:iterate>标签的使用方法
<logic:iterate>是<logic>标签库中最复杂的标签,也是用途最广的一个标签,它能够在一个循环中遍历数组、Collection、Enumeration、Iterator或Map中的所有元素。<logic:iterate>标签的使用格式为:
<logic:iterate  id="id"  name="name" property="property" indexId="indexId"/>
<logic:iterate>标签的各属性意义 
属性名 意义
id 指定存储在作用域范围中变量的名字
name 指定存储在作用域范围中集合的名字
label 指定下拉框中做为显示文本的JavaBean中的某个属性
value 指定下拉框中做为值的JavaBean中的某个属性
property 如果一个JavaBean中的某个属性是一个集合类型,可指定此项

13.Struts1框架存在的问题?
  (1) 支持的表现层技术单一
  (2) 与Servlet API严重耦合,难于测试
  (3) 代码严重依赖于Struts1 API,属于侵入式设计
 
14.Struts2与Struts1的对比?
(1) Action实现类方面:Struts1要求Action类需继承org.apache.struts.action.Action父类;Struts2中的Action无需任何特定要求,只有一个包含execute方法的POJO类都可以用作Struts2的Action
(2) 线程模式方面:Struts1中的Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有请求,所以在Action中定义的资源必须是线程安全的或同步的;Struts2中的Action对象会为每个请求产生一个实例,因此没有线程安全问题。
(3) 封装请求参数方面:Struts1使用ActionForm对象封装用户的请求参数,所有的ActionForm必须继承org.apache.struts.action.ActionForm类,开发者必须创建大量的ActionForm类来封装用户请求参数;Struts2直接使用Action属性来封装用户请求参数,避免了开发者需要大量开发ActionForm类。
(4) 表达式语言方面:Struts1整合了JSTL,因此可使用JSTL表达式语言。这种表达式语言有基本对象图遍历,但在对集合和索引属性的支持上则功能不强;Struts2可以使用JSTL,但同时整合了一种更强大和灵活的表达式语言:OGNL(Object Graph Notation Language 对象图形导航语言),因此,Struts2下的表达式语言功能更加强大。
(5) 绑定值到视图方面:Struts1使用标签JSP机制把对象绑定到视图页面;Struts2使用ValueStack(值栈)技术,使标签库能够访问值,而不需要将对象和视图页面绑定在一起。

15.Struts2框架的运行流程?
(1) 浏览器发送请求,例如请求/login.action
(2) 核心控制器FilterDispatcher根据请求决定调用合适的Action
(3) WebWork的拦截器链自动对请求应用通用功能,例如workflow、validation或文件上传等功能
(4) 回调Action的execute方法,该方法先获取用户请求参数并调用业务逻辑组件来处理用户请求
(5) Action的execute方法处理结果信息将被输出到浏览器中,可以是HTML页面、图像,也可以是PDF文档或其它文档。此时支持的视图技术非常多,既支持JSP,也支持Velocity、FreeMarker等模板技术。

16.什么是Struts2动态方法调用
用户注册页面包含两个提交按钮,但分别提交给Action的不同方法处理,其中“注册”按钮希望使用注册逻辑来处理请求,而“检验”按钮则希望使用检验逻辑来处理请求。
Struts2使用DMI(Dynamic Method Invocation,动态方法调用)来处理这种请求,动态方法调用指定表单元素的action属性格式如下:
action=”ActionName!methodName.action”,其中”ActionName”表示Action名字,”methodName”表示方法名,
例如,如果存在一个名为userManager的Action,该Action中有一个名为reg的方法。
如果希望某个表单提交后,能执行reg方法,则使用动态方法调用的表单的代码片段如下:
 <form action=userManager!reg.action>
     . . .
</form>

17.什么是Struts2模型驱动

相比Struts1中的Action类,
Struts2的Action承担了太多的职责:既要通过属性封装用户请求参数,也要通过execute方法处理业务逻辑。
这种模式分工不清晰,为了结构清晰的考虑,应该采用单独的Model实例来封装请求参数,
这就是所谓的模型驱动。Struts2的模型驱动其实和Struts1中的ActionForm有点类似,
在Struts1中每一个Action都必须有一个ActionForm与之对应,而Struts2中,
每一个Action同样需要提供一个POJO对象,用来封装表单属性

18.如何实现Struts2国际化
 a.编写资源文件
 b.加载资源文件
 c.使用<s:text>标签显示国际化信息
 d.创建业务逻辑控制器Action用于根据请求实现中英文切换
 e.配置struts.xml文件

19。开发自定义类型转换器的步骤
  a.创建一个自定义转换器类,该类继承StrutsTypeConverter抽象类
  B.注册PointConvert自定义类型转换器

20。什么是拦截器
   拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行。同时也提供了一种可以提取action中通用操作的方式。因为拦截器是通过配置文件指定的,因此通过拦截器来引入通用操作的方式,完是可插拔的,当系统需要执行这些通用操作时,则配置文件引入这些拦截器即可;如果系统不再需求执行这些通用操作,则在配置文件中取消引入这些拦截器即可

21。如何使用拦截器实现文件过滤
  <action name="upload" class="com.soft.struts7l.web.struts.action.UploadAction">       
       <interceptor-ref name="fileUpload">
         <param name="allowedTypes">image/jpeg,image/bmp,image/gif</param>
        </interceptor-ref>      
       <interceptor-ref name="defaultStack"/>      
       <param name="savePath">/uploadfiles</param>
       <result name="success">/fileuploadsuccess.jsp</result>
       <result name="input">/error.jsp</result>
</action> 

22.OGNL中#符号的作用
a.访问OGNL上下文和Action上下文,例如#userid、#session.userid
b.用于过滤和投影(projecting)集合,如books.{?#this.price<100};
c.构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。

23.<s:token>标签的使用步骤
(1) 创建用于处理用户注册的业务逻辑控制器Action
(2)  创建JSP页面,并使用<s:token>标签
(3) 编写用于显示重复提交错误信息的资源文件
(4) 在struts.xml中配置token拦截器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值