当前位置:文档之家› Struts2的Action

Struts2的Action

Struts2的Action
Struts2的Action

对于Struts2应用中的开发者来说,Action才是整个应用系统的核心,开发者需要提供大量的Action类,并且在struts.xml文件中对Action类进行配置,Action中包含了对用户请求的处理逻辑,因此,我们也称Action为业务控制器.

1) 实现Action实现类

相对于Struts1而言,Struts2采用的低侵入式的设计,Struts2不要求Action类继承任何的Struts2基类,或者实现任何的Struts2的接口,在这种设计方式下,Struts2的Action类是一个非常普通的POJO(但是通常会包含一个没有参数的execute()方法),从而,有很好的代码复用性.

Struts2通常直接使用Action来封装HTTP请求参数,因此,Action类里面还应该包含与请求参数相对应的属性,并且为这些属性提供getter和setter方法.

比如说,用户请求包含user和password两个请求参数,那么Action就应该提供user和两个属性来封装用户的请求参数,并且为user和password提供对应的getter和setter方法,西面是处理该请求的Action的代码片段:

package com.supermos.app.Action;

//处理用户请求的Action类,这个只是一个POJO类

//不需要继承任何的基类,不需要实现任何的接口

public class LoginAction {

//提供两个属性来封装HTTP请求的参数

private String user;

private String password;

public String getUser() {

return user;

}

public void setUser(String user) {

https://www.doczj.com/doc/a74125673.html,er = user;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

//Action类默认来处理用户请求的方法,execute

public String execute(){

//处理结束,返回一个字符串,这个字符串将对应视图物理资源

return "success";

}

}

上面的Action类只是一个普通的Java类,这个Java类提供了两个属性,user和password,这个两个属性分别对应两个HTTP请求参数.

(即使Action需要处理的请求包含user和password两个HTTP请求参数,Action类也是可以不包含user和password两个属性的,因为系统是通过对应的getter和setter方法来处理请求参数的,而不是通过属性的名字来处理请求参数的,也就是说,如果包含user的HTTP请求参数,Action类里面是否包含user属性并不重要,重要的是要包含void setUser(String user)和String getUser()这两个方法)

Action类的属性,不仅可以用于封装请求参数,还可以用于封装处理结果.比如在前面的Action 代码中看到的,如果希望将服务器提示的”登录成功”在下一个页面中输出,那么,我们可以在Action类中增加一个tip属性,并且为该属性提供对应的getter和setter方法,也就是为Action 类增加如下的代码片段:

//封装服务器提示的tip属性

private String tip;

public String getTip() {

return tip;

}

public void setTip(String tip) {

this.tip = tip;

}

一旦在Action中设置了tip属性的值,我们就可以在下一个页面当中使用struts2标签来输出该属性的值,在jSP页面当中输出tip属性值的代码片段如下:

系统不会严格区分Actino里面的那个属性是用来封装请求参数的属性,那个事用来封装结果的属性,对于系统来说,封装请求参数和封装处理结果的属性石完全平等的.如果用户的HTTP 请求里面包含了tip的请求参数,系统就会调用Action的void setTip(String tip)方法,通过这种方式,名为tip的请求参数就可以传给Action实例,如果Action类里面没有包含对应的方法,那么名字为tip的请求参数也就无法传入该Action.

同样,在JSP页面中输出的Action属性的时候,它也不会区分该属性是用来封装请求参数的还是用于封装处理结果的属性,所以说,使用Struts2的标签既可以输出Action的处理结果,也可以输出Http请求参数值.

从上面的代码可以看到,需要在JSP页面中输出的处理结果是一个非常简单的字符串,可以使用标签来控制输出.实际上,Action类里面可以封装非常复杂的属性,包括其他用户自己定义的属性,数组,集合对象和Map对象等等.对于这些复杂类型的输出,一样可以通过Struts2的标签来完成.

为了让用户开发的Action来更加的规范,Struts2提供了一个Action接口,这个接口定义了Struts2的Action处理类应该实现的规范,下面是Action接口的代码:

public interface Action {

public static final String SUCCESS="success";

public static final String ERROR="error";

public static final String INPUT="input";

public static final String LOGIN="login";

public static final String NONE="none";

public String execute()throws Exception;

}

上面的Action接口里面只定义了一个execute方法,该接口的规范规定了Action类应该包含一个execute方法,该方法的作用是返回一个字符串,除此之外,该接口还定义了5个字符串常量,他们的作用是统一execute方法的返回值.

比如说,当Action处理完用户的请求成功之后,有人喜欢返回welcome这种字符串,有的人喜欢返回success字符串…这样不利于项目的统一管理.Struts2的Action定义上面的5个字符串:error,none,input,longin和success等等分别代表了特定的含义,当然,如果开发者依然希望使用特定的字符串做为逻辑视图的名字,开发者依然可以返回自己的视图.

另外,Struts2还提供了Action类的一个实现类:ActionSupport,下面是Action类的代码:

package com.opensymphony.xwork2;

import com.opensymphony.xwork2.util.ValueStack;

import com.opensymphony.xwork2.util.logging.Logger;

import com.opensymphony.xwork2.util.logging.LoggerFactory;

import java.io.Serializable;

import java.util.*;

/**

* Provides a default implementation for the most common actions.

*/

//系统提供的ActionSupport类

public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider,

LocaleProvider, Serializable {

protected static Logger LOG = LoggerFactory.getLogger(ActionSupport.class);

private final transient TextProvider textProvider = new TextProviderFactory().createInstance(getClass(), this);

private final ValidationAwareSupport validationAware = new ValidationAwareSupport();

//收集校验错误的方法

public void setActionErrors(Collection errorMessages) {

validationAware.setActionErrors(errorMessages);

}

//返回校验错误的方法

public Collection getActionErrors() {

return validationAware.getActionErrors();

}

public void setActionMessages(Collection messages) {

validationAware.setActionMessages(messages);

}

public Collection getActionMessages() {

return validationAware.getActionMessages();

}

/**

* @deprecated Use {@link #getActionErrors()}.

*/

@Deprecated public Collection getErrorMessages() { return getActionErrors();

}

/**

* @deprecated Use {@link #getFieldErrors()}.

*/

@Deprecated public Map> getErrors() { return getFieldErrors();

}

//设置表单域校验错误信息

public void setFieldErrors(Map> errorMap) { validationAware.setFieldErrors(errorMap);

}

//返回表单域校验错误信息

public Map> getFieldErrors() {

return validationAware.getFieldErrors();

}

//控制locale的相关信息

public Locale getLocale() {

ActionContext ctx = ActionContext.getContext();

if (ctx != null) {

return ctx.getLocale();

} else {

LOG.debug("Action context not initialized");

return null;

}

}

public boolean hasKey(String key) {

return textProvider.hasKey(key);

}

//返回国际化信息的方法

public String getText(String aTextName) {

return textProvider.getText(aTextName);

}

public String getText(String aTextName, String defaultValue) {

return textProvider.getText(aTextName, defaultValue);

}

public String getText(String aTextName, String defaultValue, String obj) { return textProvider.getText(aTextName, defaultValue, obj);

}

public String getText(String aTextName, List args) {

return textProvider.getText(aTextName, args);

}

public String getText(String key, String[] args) {

return textProvider.getText(key, args);

}

public String getText(String aTextName, String defaultValue, List args) { return textProvider.getText(aTextName, defaultValue, args);

}

public String getText(String key, String defaultValue, String[] args) { return textProvider.getText(key, defaultValue, args);

}

public String getText(String key, String defaultValue, List args, V alueStack stack) { return textProvider.getText(key, defaultValue, args, stack);

}

public String getText(String key, String defaultValue, String[] args, ValueStack stack) { return textProvider.getText(key, defaultValue, args, stack);

}

public ResourceBundle getTexts() {

return textProvider.getTexts();

}

public ResourceBundle getTexts(String aBundleName) {

return textProvider.getTexts(aBundleName);

}

public void addActionError(String anErrorMessage) {

validationAware.addActionError(anErrorMessage);

}

public void addActionMessage(String aMessage) {

validationAware.addActionMessage(aMessage);

}

public void addFieldError(String fieldName, String errorMessage) { validationAware.addFieldError(fieldName, errorMessage);

}

public String input() throws Exception {

return INPUT;

}

public String doDefault() throws Exception {

return SUCCESS;

}

/**

* A default implementation that does nothing an returns "success".

*

* Subclasses should override this method to provide their business logic. *

* See also {@link com.opensymphony.xwork2.Action#execute()}.

*

* @return returns {@link #SUCCESS}

* @throws Exception can be thrown by subclasses.

*/

//默认的处理用户请求的方法,直接返回success字符串public String execute() throws Exception {

return SUCCESS;

}

public boolean hasActionErrors() {

return validationAware.hasActionErrors();

}

public boolean hasActionMessages() {

return validationAware.hasActionMessages();

}

public boolean hasErrors() {

return validationAware.hasErrors();

}

public boolean hasFieldErrors() {

return validationAware.hasFieldErrors();

}

/**

* Clears field errors. Useful for Continuations and other situations

* where you might want to clear parts of the state on the same action. */

public void clearFieldErrors() {

validationAware.clearFieldErrors();

}

/**

* Clears action errors. Useful for Continuations and other situations * where you might want to clear parts of the state on the same action. */

public void clearActionErrors() {

validationAware.clearActionErrors();

}

/**

* Clears messages. Useful for Continuations and other situations

* where you might want to clear parts of the state on the same action. */

public void clearMessages() {

validationAware.clearMessages();

}

/**

* Clears all errors. Useful for Continuations and other situations

* where you might want to clear parts of the state on the same action.

*/

public void clearErrors() {

validationAware.clearErrors();

}

/**

* Clears all errors and messages. Useful for Continuations and other situations * where you might want to clear parts of the state on the same action.

*/

public void clearErrorsAndMessages() {

validationAware.clearErrorsAndMessages();

}

/**

* A default implementation that validates nothing.

* Subclasses should override this method to provide validations.

*/

//包含空的输入校验方法

public void validate() {

}

@Override public Object clone() throws CloneNotSupportedException {

return super.clone();

}

public void pause(String result) {

}

}

正如上面的代码看到的,该Action是一个默认的Action类,该类里面已经提供了很多默认的方法,这些默认的方法包括获取国际化信息的方法,数据校验的方法,默认的处理用户请求的方法等等,实际上,ActionSupport类是Struts2默认的Action处理类,如果让开发者的Action类继承该ActionSupport来,就会大大的简化Action的开发.

(当用户配置的Action类没有指定class属性的时候,系统会自动使用ActionSupport类作为默认的Action处理类)

2) Action访问Servlet API

Struts2的Action并没有直接和任何的Servlet API进行耦合,这是Struts2的一个改良之处,因为Action类不再和Servlet API耦合,就可以更加轻松的去测试该Action,就不用mock去模拟数据测试了.

但是对于web应用的控制器而言,不访问Servlet API几乎是不可能的,比如说跟踪HTTP

Session的状态等等.Struts2框架提供了一种更加轻松的方式来访问Servlet API,Web应用中通常需要访问的Servlet API就是HttpServletRequest,HttpSession和HttpContext,这三个类分别代表JSP内置对象里面的request,session和application.

Struts2提供了一个ActionContext类,Struts2的Action可以通过该类来访问Servlet API,下面是ActionContext类中包含的几个常用的方法:

l Object get(Object key):该方法类似于调用HttpServletRequest的getAttribute(String name)方法.

l Map getApplication():返回一个Map对象,该对象模拟了该应用的ServletContext 实例.

l static ActionContext getContext():静态方法,获取系统的ActionContext实例.

l Map getParameters():获取所有的请求参数,类似于调用HttpServletRequest对象的getParameterMap方法.

l Map getSession():返回一个Map对象,这个Map对象模拟了HttpSession实例.

l void setApplication(Map application):直接传入一个Map实例,将该Map实例里面的key-value对转换成application的属性名属性值.

l void setSession(Map session):直接传入一个Map实例,将该Map实例里面的key-value对转换成session的属性名和属性值.

下面的一个应用将在Action类中通过ActionContext访问ServletAPI:

①系统提交请求到LoginAction,LoginAction的代码如下:

package com.supermos.app.Action;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionContext;

public class LoginAction implements Action{

private String username;

private String password;

public String getUsername() {

return username;

}

public void setUsername(String username) {

https://www.doczj.com/doc/a74125673.html,ername = username;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public String execute(){

//获取ActionContext实例,通过该实例访问Servlet API

ActionContext ctx=ActionContext.getContext();

//获取ServletContext里面的counter属性

Integer counter=(Integer)ctx.getApplication().get("counter");

//如果counter的属性为空,就设置该counter的属性为1 if(counter==null){

counter=1;

}

//否则,将counter加1

else{

counter=counter+1;

}

//将增加1之后的counter的值设置为counter属性

ctx.getApplication().put("counter", counter);

//将登陆用的username属性设置为一个HttpSession属性

ctx.getSession().put("user",this.getUsername());

if("supermos".equalsIgnoreCase(this.getUsername())&&"ziwen".equalsIgnoreCase(this.getPassw ord())){

//直接设置HttpServletRequest属性,下面的代码的作用类似于设置HttpServletRequest属性

//request.setAttribute("tip","服务器提示,您已经成功登陆");

ctx.put("tip", "服务器提示,您已经成功登陆");

return this.SUCCESS;

}else{

//直接设置HttpServletRequest属性

ctx.put("tip","服务器提示,您登陆失败,请检查您的用户名和密码");

return this.ERROR;

}

}

}

②上面的Action访问了HttpServletRequest的属性,也访问了HttpSession的属性,还让问

了HttpContext的属性,将该Action配置在struts.xml文件中,struts.xml文件的代码如下:

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"https://www.doczj.com/doc/a74125673.html,/dtds/struts-2.0.dtd">

/success.jsp

/error.jsp

/login.jsp

③如果浏览者在页面中输入用户名supermos密码ziwen的时候,将提交给LoginAction 来进行处理,该Action的execute方法分别设置了HttpServletRequest属性,HttpSession属性和ServletContext属性,为了验证是否成功设置了这三个属性,我们在success.jsp页面中访问这三个对象的属性:代码如下:

<%@ page language="java" pageEncoding="utf-8"%>

<%@ taglib uri="/struts-tags" prefix="s" %>

登录系统

本站的访问次数为:${applicationScope.counter}

${https://www.doczj.com/doc/a74125673.html,er },您已经登录!

${requestScope.tip }

显然,相比Struts1中直接访问ServletAPI,Strut2通过ActionContext访问ServletAPI更加的优雅,让Action彻底从ServletAPI中分离出来,从而可以允许该Action脱离web容器.最大的好处就是可以脱离web容器测试Action.

3) Action直接访问ServletAPI

虽然Struts2提供了ActionContext来访问ServletAPI,但是这种方式毕竟不能够直接获得ServletAPI的实例,为了在Action中直接访问ServletAPI,Struts2还提供了如下的几个接口:

l ServletContextAware:实现该接口的Action可以直接访问Web应用的ServletContext实例.(aware[??w??]意识到的,知道的)

l ServletRequestAware:实现该接口的Action可以直接访问服务器相应的HttpServletRequest实例

l ServletResponseAware:实现该接口的Action可以直接访问服务器相应的HttpServletResponse实例.

下面以ServletResponseAware为例子,介绍如何在Action中访问HttpServletResponse对象,本应用通过HttpServletResponse为系统添加Cookie对象.下面是该上面例子的Action的修改:

package com.supermos.app.Action;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.Action;

import com.opensymphony.xwork2.ActionContext;

public class LoginAction implements Action,ServletResponseAware{ //需要访问的HttpServletResponse对象

private HttpServletResponse response;

private String username;

private String password;

public String getUsername() {

return username;

}

public void setUsername(String username) {

https://www.doczj.com/doc/a74125673.html,ername = username;

}

public String getPassword() {

Struts2框架工作原理及应用体会

2012年第11卷第6期 产业与科技论坛2012.(11).6 Industrial &Science Tribune Struts2框架工作原理及应用体会 □宋 君 张家爱 【摘要】通过针对特定用户的分析,搭建以Struts2为技术核心的旅行社管理系统。本文简单的介绍了MVC 、 Struts2的工作原理,同时总结了在项目制作过程中所得到的心得。 【关键词】 Struts2;MVC ;FilterDispatcher ;Action 【基金项目】本文为大学生科技创新院级基金项目(编号:2011070)成果 【作者单位】宋君,吉林农业科技学院信息工程学院;张家爱,吉林农业科技学院信息工程学院教师 本着锻炼自我与积极参与到实用性技术的目标,以发掘自身创新意识为前提。利用空闲时间,在老师的指导下,进行了一次大学生创新项目的实践性活动。本着实用原则,以某中小旅行社为客户(根据用户需求,匿名),以Struts2框架为基点,进行了一次旅行社管理系统的开发。在项目结束之余, 特将在项目过程中经历的种种认识进行了简单的总结,希望让阅读本文的朋友们,更多的参与到此类活动中。 一、基础思想— ——MVC 简述作为时下经典框架之一, MVC 具有其独特的价值。MVC 框架简单的说,就是将数据模型与用户视图进行分离。通过控制器进行协调处理的一种结构是框架。同时,也是本文中要讨论的Sturts2框架的基础思想。 M 是指模型层(Model ),V 是指用户视图(View ),C 则是指控制器 (Controller )。这种划分方式是以将模型层与视图层进行代码分离,从而降低两者之间的耦合性,使同一程序可以使用不同形式进行表现。不同层之间的修改不会或尽量少的印象到其他层功能的史前为前提。有效的提高的代码的维护性和设计难度。 图1 二、 Struts2工作原理(一)Struts2框架组成。Struts2框架由三个主要部分组成:核心控制器、业务控制器,以及由用户实现的业务逻辑组件。这里我们将侧重于核心控制器与业务控制器的理解与说明。 (二)核心控制器:FilterDispatcher 。FilterDispatcher 是Struts2框架的核心控制器,在此,我们可以将FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求的结尾为action ,则将该请求转入Struts2框架进行处理。当Struts2框架获得了*.actio 请求后,会根据请求前面“*”的那部分内容,决定调用哪个业务逻辑组件作为响应单位。这里需要说明的是Struts2用来处理用户请求的Action 实例并不是业务控制器,而是作为Action 的代理———正因为Struts2的一大特点,与Servlet API 的非耦合性,使得用户实现的业务控制器无法直接处理用户请求。有效的提高了后期调试维护的效率。而Struts2框架再次提供了了一系列的拦截器。这些拦截器负责将HttpServletRequest 请求的参数解析出来,传入Action 中,并毁掉Action 的Execute 方法来处理用户请求。用户实现的Action 类仅作为Struts2的Action 代理的代理目标。用户实现的业务控制器则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象中,而用户的Action 类无需访问HttpServletRequest 对象。拦截器负责将HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件Action 实例。 (三)业务控制器。业务控制器就是前文提到的用来实现用户Action 的实力,这里的每个Action 类通常包含有一个execute 方法,当业务控制器处理完用户的请求后,该方法将会针对此次处理返回一个字符串— ——该字符串就是一个逻辑树图名。当程序开发人员开发出系统所需要的业务控制器后,还需要针对性的配置Struts2的Action ,即需要配置Ac- tion 的以下三个部分:(1)Action 所处理的URl 。(2)Action 组件所对应的实现类。(3)Action 里包含的逻辑试图和物理资源之间的对应关系。每个Action 都要处理一个用户请求,而用户请求则总是包含有指定的URL 。当核心控制器过滤用户请求,并调用后,根据请求的URL 和Action 处理URL 之间的对应关系来处理转发。 · 342·

Struts2练习题说课讲解

Struts 2作业 1.简述什么是MVC? 答:MVC 的全称为model-view-controller(模型-视图-控制器)。MVC 是一种开发应用程序的模式,这个模式已经具有了很好的框架架构,并且十分容易维护。使用MVC 开发出来的应用程序一般包括以下几块内容:·控制器(Controller):控制器类处理客户端向Web 应用程序发出的请求,获取数据,并指定返回给客户端,用来显示处理结果的视图。·模型(Model):模型类代表了应用程序的数据,这些数据通常具有一个数据验证逻辑,用来使得这些数据必须符合业务逻辑。·视图(View):视图类是Web 应用程序中用来生成并显示HTML 格式的服务器端对客户端请求的响应结果的模板文件 2.Struts 2以(WebWork)为核心,采用(拦截器)的机制来处理用户的 请求。 3.简述一个请求在Struts 2框架中的处理流程,请按自己对框架的理解叙述。答:1-用户提交自己的请求;2-由web.xml拦截,转发到action进行处理;3- Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面。 4.不属于Action接口中定义的字符串常量是( B )? A)SUCCESS B)FAILURE C)ERROR D)INPUT 5.资源文件的后缀名为(D)? A)txt B)doc C)property D)properties 6.在JSP页面中可以通过Struts 2提供的(D)标签来输出国际化信息。 A) B) C) D) 7.以文字过滤拦截器为例,简述拦截器的使用步骤。 答:1-用户提交自己的请求; 2-由web.xml拦截,转发到action进行处理; 3- Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面; 8.在同一个系统中配置多个拦截器,试说明它们的执行顺序。 答:一般来说:先配置的拦截器,会先获得执行的机会,但是实际情况不是这样。execute()方法执行之前,配置在前面的拦截器,会先对用户的请求起作用。execute()方法执行之后,配置在后面的拦截器,会先对用户的请求起作用。(两头向中间靠拢的执行)。 9.请简述struts2中输入校验的几种方式。

struts2验证框架

Struts2Validator Struts2验证框架 Updated Jun 18, 2010 by cm2...@https://www.doczj.com/doc/a74125673.html, Action配置中一定要设置input返回页面 添加验证只要创建验证的xml文件 1.创建xml文件名 验证Action中全部方法 在Action同包下,创建:Action类名-validation.xml 如:ValidateAction创建ValidateAction-validation.xml 验证Action中单个方法 注意事项 注意: 1.要验证的方法不能叫input. 2.这样配置在form表单中要在中action写好名称, 不能写action="validate_",然后 这样会找不到对应的配置文件,跳过验证. 3.如果验证出错,返回input页面时,那些存在ValueStack中的值会丢失,可以将Action实现Preparable接口, 然后prepare()方法里初始化添加页面需要的值. 4.如果使用Preparable接口,必须在action配置中添加

java-struts2复习题

Struts2复习题 1.以下属于struts2的控制器组件是: A.Action B.ActionForm C.ActionServlet D.dispatchAction 2.以下属于struts2的体系结构的是:(多选) A.struts2控制器组件 B.struts2配置文件 C.FilterDispathcer D.Action 3.以下属于struts2配置文件中的配置元素是:(多选) A. B. C. D. 4.关于struts1和struts2对比的说法正确的是: A.struts1要求Action类继承struts1框架中的Action父类,struts2中则不一定需要继承,可以是POJO类 B.struts1中的Action不是线程安全的,而struts2中的Action是线程安全的 C.struts1和struts2中都使用ActionForm对象封装用户的请求数据 D.struts1使用OGNL表达式语言来支持页面效果,struts2通过ValueStack技术使标签库访问值 5.以下关于ValueStack说法正确的是:(多选) A.每个Action对象实例拥有一个ValueStack对象 B.每个Action对象实例拥有多个ValueStack对象 C.Action中封装了需要传入下一个页面的值,这些值封装在ValueStack对象中 D.ValueStack会在请求开始时被创建,请求结束时消亡 6.关于struts2配置文件说法正确的是: A.必须在WEB-INF/classes目录下 B.名字必须为struts.xml C.配置Action时,必须配置包信息 D.使用元素配置转发 7.在struts2配置中用()元素来配置常量: A. B. C. D. 8.关于struts2包的说法正确的是: A.struts2框架使用包来管理常量 B.struts2框架定义包时必须指定name属性 C.struts2框架中配置包时,必须继承自struts-default包,否则会报错 D.struts2框架中使用包来管理Action 9.struts2中获取Servlet API的方法正确的是:(多选) A.使用ActionContext对象以解耦合的方法访问Servlet API B.使用ServletActionContext对象以解耦合的方式访问Servlet API C.使用ActionContext对象以耦合的方式访问Servlet API D.使用ServletActionContext对象以耦合的方式访问Servlet API 10.struts2动态调用的格式为: A.ActionName?methodName.action B.ActionName! methodName.action C.ActionName*methodName.action D.ActionName@mathodName.action 11.如果要实现struts2的数据校验功能 A.普通Action类可以实现

struts2标签使用实例

Struts2中数据标签使用示例 S truts2提供了大量丰富的标签供使用,它不再像S truts1中一样,将种类标签进行分门列别,但可以根据其使用的用途用以区别。本文通过对S truts2中数据标签的学习,来对S truts2中标签的学习起到一个抛砖引玉的作用。 文中将介绍Action标签、Bean标签、Data标签、Include标签、P aram标签、Set标签、T ext标签、P roperty 标签等标签。 代码下载:https://www.doczj.com/doc/a74125673.html,/y1ps2Mjpc3NiLKuetMOpCsZOOypD6KSdo8-46Zy2wpoMcABeo4vOC NJXtWDEO93-TXgZogwAF YxSOni5BEG2EoN65OFwHdG71v-/St ruts2DataTags.rar?download 一、标签 Action标签,顾名思义,是用来调用Action的标签,在JSP中页面中,可以指向具体指定某一命名空间中的某一Action。而标签的主体用于显示及渲染Actionr的处理结果。 1.WebRoot\pages\dataTagssuccess.jsp处理页面 <%@ page contentType="text/htm l; charset=GBK" %> <%@ taglib prefix="s" uri="/struts-tags" %> Action Tag 示例

Action Tag 示例

s:action标签用于在页面显示结果. 这里使用标签进行页面跳转,并用于显示处理的结果。 2.先来看st ruts.xml中的配置: /pages/dataTags/success.jsp

struts2 实验报告

1.系统分析与设计 1.1 系统功能描述 本系统是个非常简单的注册、登录系统。本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。 当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。 当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。 系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。 系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。 当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。 除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。 1.2 系统功能流程

1.3 数据库设计 相关的映射文件: 一旦提供了上面的映射文件,Hibernate 就可以理解User 和user_table 之间的对应关系。 2.系统实现与测试 2.1 系统采用的关键技术 MVC 框架采用了Struts2框架,Struts2框架的易用性,极好的简化了系统的MVC 层的实现;本系统使用了Struts2的JSON 插件来完成Ajax 功能,除此之外本系统为了避免进行底层的Ajax 交互,还是用了一个简单Prototype.js 函数库,用以简化Ajax 编程。Struts2框架的稳定性,为系统的稳定运行提供了保证。

structs2知识点

Struts2原理 上图来源于Struts2官方站点,是Struts 2 的整体结构。 Struts2框架由3个部分组成:核心控制器FilterDispatcher、业务控制器和用户实现的业务逻辑组件。在这3个部分里,Struts 2框架提供了核心控制器FilterDispatcher,而用户需要实现业务控制器和业务逻辑组件。 (1)核心控制器:FilterDispatcher

FilterDispatcher是Struts2框架的核心控制器,该控制器作为一个Filter运行在Web应用中,它负责拦截所有的用户请求,当用户请求到达时,该Filter 会过滤用户请求。如果用户请求以action结尾,该请求将被转入Struts2框架处理。 Struts2框架获得了*.action请求后,将根据*.action请求的前面部分决定调用哪个业务逻辑组件,例如,对于login.action请求,Struts2调用名为login的Action来处理该请求。 Struts2应用中的Action都被定义在struts.xml文件中,在该文件中定义Action 时,定义了该Action的name属性和class属性,其中name属性决定了该Action 处理哪个用户请求,而class属性决定了该Action的实现类。 Struts2用于处理用户请求的Action实例,并不是用户实现的业务控制器,而是Action代理——因为用户实现的业务控制器并没有与Servlet API耦合,显然无法处理用户请求。而Struts2框架提供了系列拦截器,该系列拦截器负责将HttpServletRequest请求中的请求参数解析出来,传入到Action中,并回调Action 的execute方法来处理用户请求。 (2)一个请求在Struts2框架中的处理大概分为以下几个步骤 1 .客户端初始化一个指向Servlet容器(例如Tomcat)的请求,即HttpServletRequest请求。 2 .这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3. 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4 .如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 5 .ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类 6 .ActionProxy创建一个ActionInvocation的实例。 7 .ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8 .一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

Struts2的工作机制原理分析及实例

Struts2的工作机制分析及实例 一、概述 本章讲述Struts2的工作原理。 读者如果曾经学习过Struts1.x或者有过Struts1.x的开发经验,那么千万不要想当然地以为这一章可以跳过。实际上Struts1.x 与Struts2并无我们想象的血缘关系。虽然Struts2的开发小组极力保留Struts1.x的习惯,但因为Struts2的核心设计完全改变,从思想到设计到工作流程,都有了很大的不同。 Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork 的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定、性能优异、设计成熟的WEB框架。 本章主要对Struts的源代码进行分析,因为Struts2与WebWork的关系如此密不可分,因此,读者需要下载xwork的源代码,访问https://www.doczj.com/doc/a74125673.html,/xwork/download.action即可自行下载。 下载的Struts2源代码文件是一个名叫struts-2.1.0-src.zip的压缩包,里面的目录和文件非常多,读者可以定位到 struts-2.1.0-src\struts-2.0.10\src\core\src\main\java目录下查看Struts2的源文件,如图14所示。 (图14) 二、主要的包和类 Struts2框架的正常运行,除了占核心地位的xwork的支持以外,Struts2本身也提供了许多类,这些类被分门别类组织到不同的包中。从源代码中发现,基本上每一个Struts2类都访问了WebWork提供的功能,从而也可以看出Struts2与WebWork千丝万缕的联系。但无论如何,Struts2的核心功能比如将请求委托给哪个Action处理都是由xwork完成的,Struts2只是在WebWork 的基础上做了适当的简化、加强和封装,并少量保留Struts1.x中的习惯。

Liferay Struts2 完整实例 修正

目录 一.Liferay,ext开发环境的搭建 (1) 二.集成struts2 (3) 1.依赖包: (3) 2.使用Struts2 (3) 三.使用Hibernate. Spring (4) 1.建立bean (4) 2.建立事务层: (5) 3 .建立持久层 (8) 4. Action 中调用事务层 (10) 三.将portlet注册到portal (11) 四.加入国际化 (13) 五.加入处理页面 (13) 2010年12月20日,修改在页面上的标签找不到国际化信息。 一.Liferay,ext开发环境的搭建 1.进入myeclipse,修改liferay-portal-src-5. 2.3文件名为portal。导入portal到eclipse. 2.展开portal工程目录,我们可看到一个release.properties文件, 新建一个它的扩展配置文件, 文件名为release.${username}.properties。 ${username}是计算机当前用户名 我文件名是release.Administrator.properties,文件内容只一行:lp.ext.dir=D:\myspace\ext 即扩展工程放置路径。 3.打开myeclipse里面ant视图(window--> show view --> ant) , 在ant视图中,点击添加, 选择:\portalspace\portal\目录下build.xml 顺序执行clean ,start ,build-ext

4.将liferay-portal-tomcat-6.0- 5.2.3.zip解压到D:\portalspace\目录下,并更名为servers。 在D:\portalspace\ext目录下我们可以看到app.server.properties文件, 同样我们也要建立一个扩展配置文件app.server.${username}.properties,文件内容两行:lp.ext.dir=D:/myspace/ext app.server.type=tomcat app.server.tomcat.dir=D:/ myspace /servers/tomcat-6.0.18 5.将myspace/ext 工程导入到eclipse中。 6.打开window --> preference --> myeclipse --> application servers 将其他应用服务器 disabble掉, 找到tomcat6,将tomcat home diretory 指向D:\myspace\servers\tomcat-6.0.18, 展开tomcat6,JDK选择我们配置好的JDK1.5+, JDK选项下面optional java vm argument输入如下内容: -Xms128m -Xmx256m -XX:MaxPermSize=128m 7.建立数据库lportal 。在D:\myspace\ext\ext-impl\src\portal-ext.properties文件中添加数据 库连接信息 # MySQL jdbc.default.driverClassName=com.mysql.jdbc.Driver jdbc.default.url=jdbc:mysql://localhost:3306/lportal https://www.doczj.com/doc/a74125673.html,ername=root jdbc.default.password=root hibernate.dialect=org.hibernate.dialect.MySQLDialect 若不添加以上内容liferay就会使用自带默认数据库. 8.选择 :\myspace\ext\目录下build.xml 顺序执行clean,deploy 将ext项目部署到 tomcat-6.0.18. 然后选择eclipse中的tomcat6.0启动即可 9.在浏览器里输入http://localhost:8080/可以看到portal系统了。输入emal: test@https://www.doczj.com/doc/a74125673.html, password: test登录

Struts2知识点总结

Struts2基础知识 Struts2概述 1.Struts2框架应用javaee三层结构中的web层框架。 2.Struts2框架在struts1和webwork基础之上发展的全新框架。 3.Struts2所解决的问题: 在以往实现一个功能时,都需要写很多的servlet,从而造成后期维护上的不方便。 图解: 4.现在比较稳定的Struts2版本 struts-2.3.24-all.zip 5.web层常见框架 1.struts 2.springMVC Struts2框架入门 1.导入jar包 1.在lib里面有jar包,但不能全部导入,因为里面含有一些spring 包,是不能使用的,导入会导致程序不能运行。 2.到app目录里面复制案例的jar包是最好的方法。 2.创建action 3.配置action类的访问路径

1.创建struts2核心配置文件,该核心配置文件位置和名称是固定的, 位置必须在src下面,名称为struts.xml 。 2.引入dtd约束,可以在案例文件中找到,复制在struts.xml文件中即 可。 3.action的配置 *注意访问路径: http://域名/端口号/项目名/action名.action 注意:.action可以省略,但建议不要省略,为了兼容一些老版本的浏览器。 4.配置Struts2的过滤器,可以在案例中的web.xml文件中找到,复制粘贴 即可。 Struts2执行过程 图解:

Struts2配置

1.是一种常量标签 2.修改Struts2的默认常量值 1.常用方式 在struts.xml中进行配置。 2.其它两种方式 1.在src下面创建struts.properties文件并修改。 2.在web.xml文件中进行修改。 3.Struts2最常用的常量 struts.il8n.encoding=UTF-8,解决表单在通过post方式提交中文时,中文乱码的问题。

基于Struts2框架的信息发布系统的设计与初步实现

第一章Struts2的起源和发展 说到网络应用很难让人不联想到网络信息的浏览,自从Internet进入民用领域之后,上网成为了越来越多的人闲暇时光的消磨手法。于是网络系统的开发也变得越来越总要。 1.1 Web技术的发展 随着Internet技术的大面积应用和发展,传统的静态HTML页面由于缺乏足够的用户交互能力已经无法满足日益膨胀的网络需求。人们希望Web应用中能够包含更多的动态交互功能,于是为了应对拥有更广泛用户群的动态Web开发,软件开发商分别推出的ASP和JSP两款动态网站开发解决方案。但是当时的JSP 开发并没有很科学的层次设计,最初的JSP开发中逻辑代码和前端代码杂合在一起。虽然在最初开发时这样的做法使得开发非常的容易,然而随着Web系统的使用越来越广泛,应用规模的日益增长,如果继续使用传统的简单的JSP + Servlet 结构进行Web系统的开发,则会由于系统层次混乱而导致系统的开发难度和维护成本越来越大,最终使开发过程陷入困境。 1.2 MVC思想进入Web系统开发 面对开发过程中所出现的困难,开发者们试图寻找一种能够使得开发结构更加具有条理性的开发模式。根据以往面向对象系统设计的经验,开发者开始将MVC开发模式引入Web系统的开发。MVC模式将一个应用分为三个基本部分:Model(模型)、View(视图)、Controller(控制器)。在此模式中触发事件由控制器捕获,并根据事件的类型来改变模型和视图。这样既可将系统模型与视图分离,从而使各部分能够工作在最小的耦合状态下协同工作,从来提高系统的扩展性和可维护性。将其引入Web系统开发后,系统模式由传统的JSP完成用户请求和响应改变为由控制器捕获用户请求,JavaBean完成模型操作,而JSP专门负责响应用户需求。老一代的开发框架Struts1便是这时的产物。

struts2教程(完全版)

Yaio 4 一、准备工作及实例 4 1.解压struts- 2.1.6-all.zip 4 2.六个基本包 4 3.初识struts2配置文件 4 (1).web.xml文件 4 (2).struts.xml文件 4 (3).struts.properties(参default.properties) 4 (4)struts-default.xml 5 (5)其它配置文件 5 4.让MyEclipse提示xml信息 5 5.如何使用alt+/提示 5 6.实例 5 7.开启struts2自带的开发模式常量 7 8.vo传参模式 8 9.ModerDriven传参模式(不建议采用) 8 10.为什么要使用struts2代替struts1.x 9

二、struts.xml配置及例程 9 1.配置文件的优先级 9 2.配置形式 9 3.package配置相关 10 4.分工合作include:指定多个配置文件 12 5.tomcat认证访问 12 6.初识拦截器 13 7.Action中的method属性 15 8.使用ForwardAction实现页面屏蔽。 17 8.使用default-Action配置统一访问 17 小结Action 18 9.使用通配符 18 10.使用0配置:ZERO Annotation 19 11.Result配置详解 19 12.异常处理 24 三、在Action获取Scope对象 25 方式一、与Servlet解耦合的非IOC方式 25

方式二、与Servlet解耦合的IOC方式 27 方式三、与Servlet耦合的非IOC方式 27 方式四、与Servlet耦合的IOC方式 28 四、OGNL与ValueStack(VS) 29 1.值栈入门 29 2.OGNL入门 31 3.普通方法访问 31 4.静态方法访问 31 5.默认类Math的访问 32 6.调用普通类的构造方法 32 7.集合对象初步 32 8.集合对象进阶 33 9.N语法top语法 34 10.获取Stack Context中的信息 35 11.总结$ # %的区别 35 12.总结OGNL[重点] 35 五、拦截器 36

Struts2配置详解2 配置Action

配置Action Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.opensymphony.xwork2.Action接口,并实现该接口中的execute()方法。 该方法如下: public String execute() throws Exception Struts2并不是要求所有编写的action类都要实现Action接口,也可以直接编写一个普通的Java类作为action,只要实现一个返回类型为String的无参的public方法即可:public String xxx() 在实际开发中,action类很少直接实现Action接口,通常都是从 com.opensymphony.xwork2.ActionSupport类继承,ActionSupport实现了Action接口和其他一些可选的接口,提供了输入验证,错误信息存取,以及国际化的支持,选择从ActionSupport继承,可以简化action的定义。 开发好action之后,好需要对action进行配置,以告诉Struts2框架,针对某个URL的请求应该交由哪个action进行处理。 1.Action映射: action映射是Struts2框架中的基本”工作单元”,action映射就是将一个请求 URL(即action的名字)映射到一个action类,当一个请求匹配某个action的名字 时,框架就使用这个映射来确定如何处理请求。 action元素的完整属性表 例如: /user.jsp 2. 使用method属性 在配置action时,我们可以通过action元素的method属性来指定action调用的方法,所指定的方法,必须遵循与execute方法相同的格式。 在Struts2.xml文件中,我们可以为同一个action类配置不同的别名,并使用 method属性。 在Struts.xml文件中为同一个Action类配置不同的别名 /Methods/list.jsp

struts2和springMVC的比较(超详细)

把这张图放在这里,我是想说SpringMVC和Struts2真的是不一样的,虽然在都有着核心分发器等相同的功能组件(这些由MVC模式本身决定的)。 为什么SpringMVC会赢得最后的胜利呢?谈几点我自己的看法: 第一、MVC框架的出现是为了将URL从HTTP的世界中映射到JAVA世界中,这是MVC 框架的核心功能。而在URL这一点SpringMVC无疑更加优雅。 第二、从设计实现角度来说,我觉得SpringMVC更加清晰。即使我们去对比Struts2的原理图和SpringMVC的类图,它依然很让人困惑,远没有SpringMVC更加直观:

SpringMVC设计思路:将整个处理流程规范化,并把每一个处理步骤分派到不同的组件中进行处理。 这个方案实际上涉及到两个方面: l 处理流程规范化——将处理流程划分为若干个步骤(任务),并使用一条明确的逻辑主线将所有的步骤串联起来 l 处理流程组件化——将处理流程中的每一个步骤(任务)都定义为接口,并为每个接口赋予不同的实现模式 处理流程规范化是目的,对于处理过程的步骤划分和流程定义则是手段。因而处理流程规范化的首要内容就是考虑一个通用的Servlet响应程序大致应该包含的逻辑步骤: l 步骤1——对Http请求进行初步处理,查找与之对应的Controller处理类(方法)——HandlerMapping l 步骤2——调用相应的Controller处理类(方法)完成业务逻 辑——HandlerAdapter l 步骤3——对Controller处理类(方法)调用时可能发生的异常进行处理——HandlerExceptionResolver

Struts2简单示例

Struts2增删改查例子 UserBean //要添加set,get public class UserBean{ private Long id; private String name; private String password; private int age; private Date birthday; private Long sex; private Set likes; private String des;//描述 } public class LikeBean{ private Long id; private String name; } FormAction public class FormAction{ //属性要生成get,set //标记(添加,修改) private String tip; private UserBean userBean; private List likeList; private List userList; //到列表页面 public String list(){ userList =new ArrayList(); userList.add(new UserBean("abc",19,new Date())); userList.add(new UserBean("def",70,new Date())); userList.add(new UserBean("ghi",40,new Date())); return"list"; } //到添加页面 public String toAdd(){ likeList =new ArrayList(); likeList.add(new LikeBean(new Long(1),"上网")); likeList.add(new LikeBean(new Long(2),"读书")); likeList.add(new LikeBean(new Long(3),"游戏")); tip ="add"; return"info";

struts2框架

Struts2 1.Struts2介绍 Struts2是Apache发行的MVC开源框架。Struts2是在Struts1框架的基础上融合了WebWork优秀框架升级得到的。在MVC流程框架中充当控制器角色。 M:model-----数据封装------->javabean(Hibernate、MyBatis) V:view------视图----------->jsp(JSTL+EL) C:control------控制器--------> struts2( filter) 2.开发第一个Hello word 2.1导包 1)struts2-core-2.x.x.jar :Struts 2框架的核心类库 2)xwork-2.x.x.jar :XWork类库,Struts 2在其上构建 3)ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),Struts 2框架使 用的一种表达式语言 4)freemarker-2.3.x.jar :Struts 2的UI标签的模板使用FreeMarker编写 5)commons-logging-1.1.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持 Log4J和JDK 1.4+的日志记录。 6)Commons-fileupload 拷进去

2.2 配置struts 的核心过滤器 2.3 struts.xml文件

2.4 编写Action 2.5 编写JSP页面

3.在Struts.xml配置Action 3.1 默认值 3.2 result跳转类型

struts框架介绍

这章适合做参考,如果你那里不清楚,可上这里查技术资料 二.Struts框架 struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发。 本章详细讨论struts架构。我们将看到struts是如何清晰地区分控制,事务逻辑和外观,从而简化了开发应用程序过程的。我们还将介绍struts提供的类如何使得开发工作更加简单,这些类包括: ●控制程序流程的类 ●实现和执行程序事务逻辑的类 ●自定义的标记库使得创建和验证HTML表单更加容易 1.Struts压缩包内容 文件夹jakarta-struts-1.0.2包含两个目录,lib和webapps。在lib目录中有使用struts创建 在webapps目录下有如下文件: 让我们从MVC角度观察struts框架中的组件

框架中三个部分:模型,视窗和控制器。 模型 在struts框架中,模型分为两个部分: ●系统的内部状态 ●可以改变状态的操作(事务逻辑) 内部状态通常由一组ActinForm JavaBean表示。根据设计或应用程序复杂度的不同,这些Bean可以是自包含的并具有持续的状态,或只在需要时才获得数据(从某个数据库)。 大型应用程序通常在方法内部封装事务逻辑(操作),这些方法可以被拥有状态信息的bean 调用。比如购物车bean,它拥有用户购买商品的信息,可能还有checkOut()方法用来检查用户的信用卡,并向仓库发定货信息。 小型程序中,操作可能会被内嵌在Action类,它是struts框架中控制器角色的一部分。当逻辑简单时这个方法很适合。 建议用户将事务逻辑(要做什么)与Action类所扮演的角色(决定做什么)分开。 视窗 由JSP建立,struts包含扩展的自定义标签库,可以简化创建完全国际化用户界面的过程。控制器 struts中,基本的控制器组件是ActionServlet类中的实例servelt,实际使用的servlet在配置文件中由一组映射(由ActionMapping类进行描述)进行定义。 2.Struts框架中的组件 (由于ROSE工具还未能下载,只能找来这幅图,它说明了一定问题,特别是ActionErrors,但它并没有将ActionMapping,JSP和Tag Library包含进来,有时间作完替换)

文本预览
相关文档 最新文档