【Jsp精品源码栏目提醒】:网学会员在Jsp精品源码频道为大家收集整理了“【精品】Struts2的各种技术 - 商业贸易“提供大家参考,希望对大家有所帮助!
在本系列教程中我们将学习到Struts2的各种技术。
在本教程中使用的工具和程序库的版本如下 开发工具MyEclipse6 Web服务器Tomcat6 Struts版本Struts2.0.11.1 JDK版本JDK1.5.0_12 J2EE版本
Java EE5.0 在本系列教程中Web工程的上下文路径都是struts2如果在Web根目录有一个index.
jsp文件则访问路径如下 http://localhost:8080/struts2/index.
jsp 由于MyEclipse6目前并不支持Struts2所以我们需要到struts.apache.org去下载Struts2安装包。
要想正常使用Struts2至少需要如下五个包可能会因为Struts2的版本不同包名略有差异但包名的前半部是一样的。
struts2-core-2.0.11.1.jar xwork-2.0.4.jar commons-logging-1.0.4.jar freemarker-2.3.8.jar ognl-2.6.11.jar Struts2虽然在大版本号上是第二个版本但基本上在配置和使用上已经完全颠覆了Struts1.x的方式当然Struts2仍然是基于MVC模式的也是动作驱动的可能这是唯一没变的东西。
Struts2实际上是在Webwork基础上构建起来的M
VC框架。
我们从Struts2的源代码中可以看到有很多都是直接使用的xworkWebwork的核心技术的包。
既然从技术上来说Struts2是全新的框架那么就让我们来学习一下这个新的框架的使用方法。
如果大家使用过Struts1.x应该对建立基于Struts1.x的Web程序的基本步骤非常清楚。
让我们先来回顾一下建立基于Struts1.x的Web程序的基本步骤。
1. 安装Struts。
由于Struts的入口点是ActionServlet所以得在web.xml中配置一下这个Servlet。
2. 编写Action类一般从org.apache.struts.action.Action类继承。
3. 编写ActionForm类一般从org.apache.struts.action.ActionForm类继承这一步不是必须的如果要接收客户端提交的数据需要执行这一步。
4. 在struts-config.xml文件中配置Action和ActionForm。
5. 如果要采集用户录入的数据一般需要编写若干
JSP页面并通过这些
JSP页面中的form将数据提交给Action。
下面我们就按着编写struts1.x程序的这五步和struts2.x程序的编写过程一一对应看看它们谁更“酷”。
下面我们来编写一个基于Struts2的Web
程序。
这个程序的功能是让用户录入两个整数并提交给一个Struts Action并计算这两个数的代数和如果代码和为非负数则跳转到positive.
jsp页面否则跳转到negative.
jsp页面。
【第1步】 安装Struts2 这一步对于Struts1.x和Struts2都是必须的只是安装的方法不同。
Struts1的入口点是一个Servlet而Struts2的入口点是一个过滤器Filter。
因此Struts2要按过滤器的方式配置。
下面是在
web.xml中配置Struts2的代码 ltfiltergt ltfilter-namegtstruts2lt/filter-namegt ltfilter-classgt org.apache.struts2.dispatcher.FilterDispatcher lt/filter-classgt lt/filtergt ltfilter-mappinggt ltfilter-namegtstruts2lt/filter-namegt lturl-patterngt/lt/url-patterngt lt/filter-mappinggt 【第2步】 编写Action类 这一步和Struts1.x也必须进行。
只是Struts1.x中的动作类必须从Action类中继承而Struts2.x的动作类需要从com.opensymphony.xwork2.ActionSupport类继承。
下面是计算两个整数代码和的Action类代码如下 package action import com.opensymphony.xwork2.ActionSupport public class FirstAction extends ActionSupport private int operand1 private int operand2 public String execute throws Exception if getSum gt 0 // 如果代码数和是非负整数跳到positive.
jsp页面 return quotpositivequot else // 如果代码数和是负整数跳到negative.
jsp页面 return quotnegativequot public int getOperand1 return operand1 public void setOperand1int operand1 System.out.printlnoperand1 this.operand1 operand1 public int getOperand2 return operand2 public void setOperand2int operand2 System.out.printlnoperand2 this.operand2 operand2 public int getSum return operand1 operand2 // 计算两个整数的代码数和 从上面的代码可以看出动作类的一个特征就是要覆盖execute方法只是Struts2的execute方法没有参数了而Struts1.x的execute方法有四个参数。
而且execute方法的返回值也不同的。
Struts2只返回一个String用于表述执行结果就是一个标志。
上面代码的其他部分将在下面讲解。
【第3步】 编写ActionForm类 在本例中当然需要使用ActionForm了。
在Struts1.x中必须要单独建立一个ActionForm类或是定义一个动作Form而在Struts2中ActionForm和Action已经二合一了。
从第二步的代码可以看出后面的部分就是应该写在ActionForm类中的内容。
所以在第2步本例的ActionForm类已经编写完成就是Action类的后半部分。
【第4步】 配置Action类 这一步struts1.x和struts2.x都是必须的只是在struts1.x中的配置文件一般叫struts-config.xml当然也可以是其他的文件名而且一般放到WEB-INF目录中。
而在struts2.x中的配置文件一般为struts.xml放到WEB-INFquotclasses目录中。
下面是在struts.xml中配置动作类的代码 ltxml versionquot1.0quot encodingquotUTF-8quot gt ltDOCTYPE struts PUBLIC quot-//Apache Software Foundation//DTD Struts Configuration 2.0//ENquot quothttp://struts.apache.org/dtds/struts-2.0.dtdquotgt ltstrutsgt ltpackage namequotstruts2quot namespacequot/mystrutsquot extendsquotstruts-defaultquotgt ltaction namequotsumquot classquotaction.FirstActionquotgt ltresult namequotpositivequotgt/positive.jsplt/resultgt ltresult namequotnegativequotgt/negative.jsplt/resultgt lt/actiongt lt/packagegt lt/strutsgt 在ltstrutsgt标签中可以有多个ltpackagegt第一个ltpackagegt可以指定一个Servlet访问路径不包括动作名如“/mystruts”。
extends属性继承一个默认的配置文件“struts-default”一般都继承于它大家可以先不去管它。
ltactiongt标签中的name属性表示动作名class表示动作类名。
ltresultgt标签的name实际上就是execute方法返回的字符串如果返回的是“positive”就跳转到positive.
jsp页面如果是“negative”就跳转到negative.
jsp页面。
在ltstrutsgt中可以有多个ltpackagegt在ltpackagegt中可以有多个ltactiongt。
我们可以用如下的URL来访问这个动作 http://localhost:8080/struts2/mystruts/sum.action 注Struts1.x的动作一般都以.do结尾而Struts2是以.action结尾。
【第5步】 编写用户录入接口
JSP页面 1. 主界面sum.
jsp 在Web根目录建立一个sum.
jsp代码如下 lt page languagequotjavaquot importquotjava.util.quot pageEncodingquotGBKquot gt lt taglib prefixquotsquot uriquot/struts-tagsquotgt lthtmlgt ltheadgt lttitlegt输入操作数lt/titlegt lt/headgt ltbodygt 求代数和 ltbr/gt lts:form actionquotmystruts/sum.actionquot gt lts:textfield namequotoperand1quot labelquot 操作数1quot/gt lts:textfield namequotoperand2quot labelquot 操作数2quot /gt lts:submit valuequot代数和quot /gt lt/s:formgt lt/bodygt lt/htmlgt 在sum.
jsp中使用了Struts2带的tag。
在Struts2中已经将Struts1.x的好几个标签库都统一了在Struts2中只有一个标签库/struts-tags。
这里面包含了所有的Struts2标签。
但使用Struts2的标签大家要注意一下。
在lts:formgt中最好都使用Struts2标签尽量不要用HTML或普通文本大家可以将sum.
jsp的代码改为如下的形式看看会出现什么效果 ... ... 求代数和 ltbr/gt lts:form actionquotmystruts/sum.actionquot gt 操作数1lts:textfield namequotoperand1quot /gtltbr/gt 操作数2lts:textfield namequotoperand1quot /gtltbr/gt lts:submit valuequot代数和quot /gt lt/s:formgt ... ... 提示一下在lts:formgt中Struts2使用lttablegt定位。
2. positive.
jsp lt page languagequotjavaquot importquotjava.util.quot pageEncodingquotGBKquotgt lt taglib prefixquotsquot uriquot/struts-tagsquot gt lthtmlgt ltheadgt lttitlegt显示代数和lt/titlegt lt/headgt ltbodygt 代数和为非负整数lth1gtlts:property valuequotsumquot /gtlt/h1gt lt/bodygt lt/htmlgt 3. negative.
jsp lt page languagequotjavaquot importquotjava.util.quot pageEncodingquotGBKquotgt lt taglib prefixquotsquot uriquot/struts-tagsquot gt lthtmlgt ltheadgt lttitlegt显示代数和lt/titlegt lt/headgt ltbodygt 代数和为负整数lth1gtlts:property valuequotsumquot /gtlt/h1gt lt/bodygt lt/htmlgt 这两个
jsp页面的实现代码基本一样只使用了一个lts:propertygt标签来显示Action类中的sum属性值。
lts:propertygt标签是从request对象中获得了一个对象中得到的sum属性如我们可以使用如下的代码来代替lts:property value”sum”/gt lt com.opensymphony.xwork2.util.OgnlValueStack ovs com.opensymphony.xwork2.util.OgnlValueStackrequest.getAttributequotstruts.valueStackquot out.printlnovs.findStringquotsumquot gt 启动Tomcat后在IE中输入如下的URL来测试这个例子 http://localhost:8080/struts2/sum.
jsp Struts2教程2处理一个form多个submit 在很多Web应用中为了完成不同的工作一个
HTML form标签中可能有两个或多个submit按钮如下面的代码所示 lt--if supportLineBreakNewLine--gt lthtml actionquotquot methodquotpostquotgt ltinput typequotsubmitquot valuequot保存quot /gt ltinput typequotsubmitquot valuequot打印quot /gt lt/htmlgt 由于在ltformgt中的多个提交按钮都向一个action提交使用Struts2 Action的execute方法就无法判断用户点击了哪一个提交按钮。
如果大家使用过Struts1.x就会知道在Struts1.2.9之前的版本需要使用一个LookupDispatchAction动作来处理含有多个submit的form。
但使用LookupDispatchAction动作需要访问属性文件还需要映射比较麻烦。
从Struts1.2.9开始加入了一个EventDispatchAction动作。
这个类可以通过java反射来调用通过request参数指定的动作实际上只是判断某个请求参数是不存在如果存在就调用在action类中和这个参数同名的方法。
使用EventDispatchAction必须将submit的name属性指定不同的值以区分每个submit。
而在Struts2中将更容易实现这个功能。
当然我们也可以模拟EventDispatchAction的方法通过request获得和处理参数信息。
但这样比较麻烦。
在Struts2中提供了另外一种方法使得无需要配置可以在同一个action类中执行不同的方法默认执行的是execute方法。
使用这种方式也需要通过请求参来来指定要执行的动作。
请求参数名的格式为 actionmethod.action 注由于Struts2只需要参数名因此参数值是什么都可以。
下面我就给出一个实例程序来
演示如何处理有多个submit的form 【第1步】实现主页面more_submit.
jsp lt page languagequotjavaquot importquotjava.util.quot pageEncodingquotGBKquotgt lt taglib prefixquotsquot uriquot/struts-tagsquot gt lthtmlgt ltheadgt lttitlegtMy
JSP hello.
jsp starting pagelt/titlegt lt/headgt ltbodygt lts:form actionquotsubmit.actionquot gt lts:textfield namequotmsgquot labelquot输入内容quot/gt lts:submit namequotsavequot valuequot保存quot alignquotleftquot methodquotsavequot/gt lts:submit namequotprintquot valuequot打印quot alignquotleftquot methodquotprintquot /gt lt/s:formgt lt/bodygt lt/htmlgt 在more_submit.
jsp中有两个submit保存和打印。
其中分别通过method属性指定了要调用的方法save和print。
因此在Action类中必须要有save和print方法。
【第2步】实现Action类MoreSubmitAction package action import javax.servlet.http. import com.opensymphony.xwork2.ActionSupport import org.apache.struts2.interceptor. public class MoreSubmitAction extends ActionSupport implements ServletRequestAware private String msg private javax.servlet.http.HttpServletRequest request // 获得HttpServletRequest对象 public void setServletRequestHttpServletRequest request this.request request // 处理save submit按钮的动作 public String save throws Exception request.setAttributequotresultquot quot成功保存quot msg quotquot return quotsavequot // 处理print submit按钮的动作 public String print throws Exception request.setAttributequotresultquot quot成功打印quot msg quotquot return quotprintquot public String getMsg return msg public void setMsgString msg this.msg msg 上面的代码需要注意如下两点 save和print方法必须存在否则会抛出java.lang.NoSuchMethodException异常。
Struts2 Action动作中的方法和Struts1.x Action的execute不同只使用Struts2 Action动作的execute方法无法访问request对象因此Struts2 Action类需要实现一个Struts2自带的拦截器来获得request对象拦截器如下 org.apache.struts2.interceptor. ServletRequestAware 【第3步】配置Struts2 Action struts.xml的代码如下 ltxml versionquot1.0quot encodingquotUTF-8quot gt ltDOCTYPE struts PUBLIC quot-//Apache Software Foundation//DTD Struts Configuration 2.0//ENquot quothttp://struts.apache.org/dtds/struts-2.0.dtdquotgt ltstrutsgt ltpackage namequotdemoquot extendsquotstruts-defaultquot gt ltaction namequotsubmitquot classquotaction.MoreSubmitActionquotgt ltresult namequotsavequot gt /result.
jsp lt/resultgt ltresult namequotprintquotgt /result.
jsp lt/resultgt lt/actiongt lt/packagegt lt/strutsgt 【第4步】编写结果页result.
jsp lt page pageEncodingquotGBKquotgt lthtmlgt ltheadgt lttitlegt提交结果lt/titlegt lt/headgt ltbodygt lth1gtresultlt/h1gt lt/bodygt lt/htmlgt 在result.
jsp中将在save和print方法中写到request属性中的执行结果信息取出来并输出到客户端。
启动Tomcat后在IE中执行如下的URL来测试程序 http://localhost:8080/moresubmit/more_submit.
jsp 大家也可以直接使用如下的URL来调用save和print方法 调用save方法http://localhost:8080/moresubmit/submitsave.action 调用print方法http://localhost:8080/moresubmit/submitprint.action
源代码http://www.itpub.net/attachment.phpaid520773 Struts2教程3struts.xml常用配置解析 在本文中将详细讲述struts.xml文件的
常用配置及注意事项。
1. 使用ltincludegt标签重用配置文件 在Struts2中提供了一个默认的struts.xml文件但如果package、action、interceptors等配置比较多时都放到一个struts.xml文件不太容易维护。
因此就需要将struts.
xml文件分成多个配置文件然后在struts.xml文件中使用ltincludegt标签引用这些配置文件。
这样做的优点如下 结构更清晰更容易维护配置信息。
配置文件可以复用。
如果在多个Web程序中都使用类似或相同的配置文件那么可以使用ltincludegt标签来引用这些配置文件这样可以减少
工作量。
假设有一个配置文件文件名为newstruts.xml代码如下 ltxml versionquot1.0quot encodingquotUTF-8quot gt ltDOCTYPE struts PUBLIC quot-//Apache Software Foundation//DTD Struts Configuration 2.0//ENquot quothttp://struts.apache.org/dtds/struts-2.0.dtdquotgt ltstrutsgt ltpackage namequotdemoquot extendsquotstruts-defaultquot gt ltaction namequotsubmitquot classquotaction.MoreSubmitActionquotgt ltresult namequotsavequot gt /result.
jsp lt/resultgt ltresult namequotprintquotgt /result.
jsp lt/resultgt lt/actiongt lt/packagegt lt/strutsgt 则struts.xml引用newstruts.xml文件的代码如下 ltxml versionquot1.0quot encodingquotUTF-8quot gt ltDOCTYPE struts PUBLIC quot-//Apache Software Foundation//DTD Struts Configuration 2.0//ENquot quothttp://struts.apache.org/dtds/struts-2.0.dtdquotgt ltstrutsgt ltinclude filequotnewstruts.xmlquot/gt ltpackage namequottestquot extendsquotstruts-defaultquotgt lt/packagegt lt/strutsgt 大家要注意一下用ltincludegt引用的xml文件也必须是完成的struts2的配置。
实际上ltincludegt在引用时是单独解析的xml文件而不是将被引用的文件插入到struts.xml文件中。
2. action的别名 在默认情况下Struts2会调用动作类的execute方法。
但有些时候我们需要在一个动作类中处理不同的动作。
也就是用户请求不同的动作时执行动作类中的不同的方法。
为了达到这个目的可以在ltactiongt标签中通过method方法指定要指行的动作类的方法名并且需要为不同的动作起不同的名子也称为别名。
如下面代码所示 ltxml versionquot1.0quot encodingquotUTF-8quot gt ltDOCTYPE struts PUBLIC quot-//Apache Software Foundation//DTD Struts Configuration 2.0//ENquot quothttp://struts.apache.org/dtds/struts-2.0.dtdquotgt ltstrutsgt ltpackage namequotdemoquot extendsquotstruts-defaultquot gt ltaction namequottestquot classquotaction.MyActionquotgt lt/actiongt ltaction namequotmyquot classquotaction. MyActionquot methodquotmyquotgt lt/actiongt lt/packagegt lt/strutsgt 上面代码的两个动作的class属性都指向同一个类name为这个类起了两个动作别名test和my。
在动作my中使用了method属性指定要要运行的方法名为my。
在MyAction类中必须要有my方法代码如下 package action import com.opensymphony.xwork2.ActionSupport public class MyAction extends ActionSupport public String execute throws Exception // 处理test动作的代码 public String my throws Exception // 处理my动作的代码 除了在struts.xml中配置别名还可以通过请求参数来描述指定动作并不需要在struts.xml中配置。
请求参数的格式如下 http://localhost:8080/contextPath/actionNamemethod.action 关于通过请求指定动作的详细内容请参阅笔者写的《Struts2教程2处理一个form多个submit》。
3. 为action指定参数 在struts2中还可以为action指定一个或多个参数。
大家还记着struts1.x是如何设置的action参数不 在struts1.x中可以使用ltactiongt标签的parameter属性为其指定一个action参数如果要指定多个就只能通过逗号或其他的分隔符将不同的参数隔开。
而在struts2中可以通过ltparamgt标签指定任意多个参数。
代码如下 ltaction namequotsubmitquot classquotaction.MyActionquotgt ltparam namequotparam1quotgtvalue1lt/paramgt ltparam namequotparam2quotgtvalue2lt/paramgt ltresult namequotsavequot gt /result.
jsp lt/resultgt lt/actiongt 当然在action中读这些参数也非常简单只需要象获取请求参数一样在action类中定义相应的setter方法即可.