原文:Mkyong
Struts 2 + Spring 2.5.6 + Quartz 1.6 调度器集成示例
Struts 2 + Spring 2.5.6 + Quartz 调度器集成示例
在本教程中,我们将向您展示如何将Struts 2+Spring 2 . 5 . 6+Quartz 1 . 6 . 5调度器集成在一起。这种关系看起来像这样:
Struts 2 <-- Plugin --> Spring <--(Helper)--> Quartz <---> Scheduler task
使用的工具
- 弹簧 2.5.6
- 石英
- Struts 2.1.8
- 支柱 2-弹簧-插件 2.1.8
- Maven 2
- Eclipse 3.6
Note
You may also interest at this – Struts 2 + Spring 3 + Quartz 1.8.6 integration example..
1.项目文件夹
这是项目文件夹结构。
## 2.依赖库
获取所有的依赖库,你需要 Spring,Struts2,struts 2-Spring-Plugin 和 Quartz jar 文件。
文件:pom.xml
...
<dependencies>
<!-- Struts 2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.8</version>
</dependency>
<!-- Quartz framework -->
<dependency>
<groupId>opensymphony</groupId>
<artifactId>quartz</artifactId>
<version>1.6.3</version>
</dependency>
<!-- Quartz dependency library-->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<!-- Spring framework -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
<version>2.5.6</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>2.5.6</version>
</dependency>
<!-- Struts 2 + Spring plugins -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.1.8</version>
</dependency>
</dependencies>
...
3.调度程序任务
将所有调度程序逻辑放在这个类中。
文件:SchedulerTask.java
package com.mkyong.quartz;
public class SchedulerTask {
public void printSchedulerMessage() {
System.out.println("Struts 2 + Spring + Quartz ......");
}
}
4.弹簧+石英
要集成 Spring 和 Quartz,创建一个扩展org.springframework.scheduling.quartz.QuartzJobBean
的类,通过 setter 方法引用调度器任务(【SchedulerTask.java】)并将调度器逻辑放在executeInternal()
方法中。
文件:SchedulerJob.java
package com.mkyong.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class SchedulerJob extends QuartzJobBean
{
private SchedulerTask schedulerTask;
public void setSchedulerTask(SchedulerTask schedulerTask) {
this.schedulerTask = schedulerTask;
}
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
schedulerTask.printSchedulerMessage();
}
}
文件:application context . XML——创建一个applicationContext.xml
文件,把所有 Spring + Quartz 集成的东西放在里面。有关详细信息,请阅读 XML 注释。
<beans
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- Scheduler task -->
<bean name="schedulerTask" class="com.mkyong.quartz.SchedulerTask" />
<!-- Scheduler job -->
<bean name="schedulerJob"
class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.mkyong.quartz.SchedulerJob" />
<property name="jobDataAsMap">
<map>
<entry key="schedulerTask" value-ref="schedulerTask" />
</map>
</property>
</bean>
<!-- Cron Trigger, run every 10 seconds -->
<bean id="cronTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="schedulerJob" />
<property name="cronExpression" value="0/10 * * * * ?" />
</bean>
<!-- Scheduler -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="schedulerJob" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
</beans>
5.支柱 2 +弹簧
要集成 Struts 2 + Spring ,只需将org.springframework.web.context.ContextLoaderListener
监听器类放在web.xml
文件中。
文件:web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Struts 2 Web Application</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
6.演示
启动 Strut2 时,它调用 Spring 并运行定义的 Quartz 的作业——每 10 秒调用SchedulerTask.printSchedulerMessage()
。
INFO: ... initialized Struts-Spring integration successfully
16 Julai 2010 12:51:38 PM org.apache.coyote.http11.Http11Protocol start
INFO: Starting Coyote HTTP/1.1 on http-8080
16 Julai 2010 12:51:38 PM org.apache.jk.common.ChannelSocket init
INFO: JK: ajp13 listening on /0.0.0.0:8009
16 Julai 2010 12:51:38 PM org.apache.jk.server.JkMain start
INFO: Jk running ID=0 time=0/21 config=null
16 Julai 2010 12:51:38 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 2110 ms
Struts 2 + Spring + Quartz ......
Struts 2 + Spring + Quartz ......
Struts 2 + Spring + Quartz ......
Struts 2 + Spring + Quartz ......
Struts 2 + Spring + Quartz ......
下载源代码
Download it – Struts2-Spring-Quartz-Integration-Example.zip
参考
integration quartz scheduler spring struts2
Struts 2 单选按钮示例
Download It – Struts2-Radio-Button-Example.zip
在 Struts 2 中,可以使用 < s:radio > 标签创建一个 HTML 单选按钮。有趣的是,有很多方法可以将数据填充到单选按钮中,通过列表、OGNL 或对象。看看下面的例子就知道怎么做了。
Struts 2 示例
这个例子展示了如何使用列表、OGNL 和对象向通过 Struts 2 标签创建的单选按钮填充数据。
1.行动
为单选按钮创建性别和语言值列表的操作类。
RadioButtonAction.java
package com.mkyong.common.action;
import java.util.ArrayList;
import java.util.List;
import com.mkyong.common.model.Language;
import com.opensymphony.xwork2.ActionSupport;
public class RadioButtonAction extends ActionSupport{
private List<String> genders;
private List<Language> languages ;
private String yourGender;
private String yourAnswer;
private String yourLanguage;
private static final String MALE = "male";
private static final String FEMALE = "female";
private static final String UNKNOWN = "unknown";
public RadioButtonAction(){
genders = new ArrayList<String>();
genders.add(MALE);
genders.add(FEMALE);
genders.add(UNKNOWN);
languages = new ArrayList<Language>();
languages.add( new Language("EN", "English") );
languages.add( new Language("FR", "France") );
languages.add( new Language("CN_ZH", "Chinese") );
languages.add( new Language("DE", "German") );
}
//return default gender value
public String getDefaultGenderValue(){
return UNKNOWN;
}
//return default language value
public String getDefaultLanguageValue(){
return "CN_ZH";
}
public String execute() {
return SUCCESS;
}
public String display() {
return NONE;
}
//getter ad setter methods
}
Language.java
package com.mkyong.common.model;
public class Language{
private String languageCode;
private String languageDisplay;
//getter and setter methods
public Language(String languageCode, String languageDisplay) {
this.languageCode = languageCode;
this.languageDisplay = languageDisplay;
}
}
2.结果页面
使用 Struts 2 " s:radio "通过列表、OGNL 和对象创建三个单选按钮的结果页。
radiobutton.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 radio button example</h1>
<s:form action="resultAction" namespace="/">
<h2>
<s:radio label="Gender" name="yourGender" list="genders" value="defaultGenderValue" />
<s:radio label="Gender" name="yourLanguage" list="languages"
listKey="languageCode" listValue="languageDisplay" value="defaultLanguageValue" />
<s:radio label="Answer" name="yourAnswer" list="#{'1':'Yes','2':'No'}" value="2" />
</h2>
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>a
result.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 radio button example</h1>
<h2>
Your Selected Gender : <s:property value="yourGender"/>
</h2>
<h2>
Your Selected Language : <s:property value="yourLanguage"/>
</h2>
<h2>
Your Selected Answer : <s:property value="yourAnswer"/>
</h2>
</body>
</html>
3.struts.xml
链接在一起~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="" namespace="/" extends="struts-default">
<action name="radioButtonAction"
class="com.mkyong.common.action.RadioButtonAction" method="display">
<result name="none">pages/radiobutton.jsp</result>
</action>
<action name="resultAction" class="com.mkyong.common.action.RadioButtonAction">
<result name="success">pages/result.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/radio button action . action
http://localhost:8080/struts 2 example/result action . action
To understand how to preselect a value, read this article – preselect a radio button value in Struts 2
参考
- http://struts.apache.org/2.0.11.2/docs/radio.html
- http://struts . Apache . org/2 . 1 . 8 . 1/docs/struts-2-form-tags . html
- 如何在 Struts 2 中预选单选按钮值
Struts 2 下拉框示例
Download It – Struts2-Select-DropDown-Box-Example.zip
在 Struts 2 中,可以使用 < s:select > 标签创建一个 HTML 下拉框。
<s:select label="What's your favor search engine"
headerKey="-1" headerValue="Select Search Engines"
list="searchEngine"
name="yourSearchEngine" />
产生以下 HTML 代码…
<td class="tdLabel">
<label for="resultAction_yourSearchEngine" class="label">
What's your favor search engine:
</label>
</td>
<td>
<select name="yourSearchEngine" id="resultAction_yourSearchEngine">
<option value="-1">Select Search Engines</option>
<option value="google.com">google.com</option>
<option value="bing.com">bing.com</option>
<option value="yahoo.com">yahoo.com</option>
<option value="baidu.com">baidu.com</option>
</select>
</td>
语法是不言自明的,但是“ headerKey 和“ headerValue ”。“ headerKey 是下拉列表中第一项的键,“ headerValue 是下拉列表中第一项的值表达式。
To auto select a default value for drop down box, read this artcle : Auto select drop down box value in Struts 2
Struts 2 < s:select > 示例
一个完整的 Struts 2 例子,通过 <创建下拉框:选择> ,通过 Java 列表和 OGNL 列表填充选择的选项,存储选择的值并显示在另一个页面中。
1.行动
操作类来生成和保存所选的下拉框选项。
SelectAction.java
package com.mkyong.common.action;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class SelectAction extends ActionSupport{
private List<String> searchEngine;
private String yourSearchEngine;
private String yourMonth;
public String getYourMonth() {
return yourMonth;
}
public void setYourMonth(String yourMonth) {
this.yourMonth = yourMonth;
}
public List<String> getSearchEngine() {
return searchEngine;
}
public void setSearchEngine(List<String> searchEngine) {
this.searchEngine = searchEngine;
}
public String getYourSearchEngine() {
return yourSearchEngine;
}
public void setYourSearchEngine(String yourSearchEngine) {
this.yourSearchEngine = yourSearchEngine;
}
public String getDefaultSearchEngine() {
return "yahoo.com";
}
public SelectAction(){
searchEngine = new ArrayList<String>();
searchEngine.add("google.com");
searchEngine.add("bing.com");
searchEngine.add("yahoo.com");
searchEngine.add("baidu.com");
}
public String execute() {
return SUCCESS;
}
public String display() {
return NONE;
}
}
2.结果页面
通过“ < s:select > ”标签呈现下拉框,通过 Java list 和 OGNL list 填充选择选项
select.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 drop down box example</h1>
<s:form action="resultAction" namespace="/">
<h2>
<s:select label="What's your favor search engine"
headerKey="-1" headerValue="Select Search Engines"
list="searchEngine"
name="yourSearchEngine"
value="defaultSearchEngine" />
</h2>
<h2>
<s:select label="Select a month"
headerKey="-1" headerValue="Select Month"
list="#{'1':'Jan', '2':'Feb', '3':'Mar', '4':'Apr'}"
name="yourMonth"
value="2" />
</h2>
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>
result.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 drop down box example</h1>
<h2>
Favor search engine : <s:property value="yourSearchEngine"/>
</h2>
<h2>
Selected month : <s:property value="yourMonth"/>
</h2>
</body>
</html>
3.struts.xml
链接在一起~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="selectAction"
class="com.mkyong.common.action.SelectAction" method="display">
<result name="none">pages/select.jsp</result>
</action>
<action name="resultAction" class="com.mkyong.common.action.SelectAction">
<result name="success">pages/result.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/select action . action
http://localhost:8080/struts 2 example/result action . action
参考
Struts 2 textarea 示例
Download It – Struts2-TextArea–Example.zip
在 Struts 2 中,你可以使用 < s:textarea > 来创建一个 HTML textarea 字段。
<s:textarea label="Address" name="address" cols="40" rows="10"/>
它将呈现为以下 HTML 代码。
<textarea name="address" cols="40" rows="10" id="formaction_address"></textarea>
Struts 2 示例
一个页面包含一个地址文本区字段,并在表单提交后显示文本区值。
1.行动
TextAreaAction.java
package com.mkyong.common.action;
import com.opensymphony.xwork2.ActionSupport;
public class TextAreaAction extends ActionSupport{
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String execute() {
return SUCCESS;
}
}
2.查看页面
Struts 2 " s:textarea "标记来创建一个 textarea 字段。
textarea.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 - textarea example</h1>
<s:form action="helloTextarea" namespace="/">
<h2>
<s:textarea label="Address" name="address" cols="40" rows="10"/>
</h2>
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>
welcome.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 - textarea example</h1>
<h2>
<s:property value="address"/>
</h2>
</body>
</html>
3.struts.xml
链接在一起~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="" namespace="/" extends="struts-default">
<action name="textarea">
<result>pages/textarea.jsp</result>
</action>
<action name="helloTextarea"
class="com.mkyong.common.action.TextAreaAction">
<result name="success">pages/welcome.jsp</result>
</action>
</package>
</struts>
4.演示
http://localhost:8080/struts 2 example/textarea . action
参考
Struts 2 文本框示例
Download It – Struts2-textbox-Example.zip
在 Struts 2 中,你可以使用 < s:textfield > 来创建一个 HTML 输入框。例如,您可以用一个键属性或标签和名称属性来声明“ s:textfield ”。
<s:textfield key="username" />
//or
<s:textfield label="Username" name="username" />
两者都生成相同的 HTML 输出(默认的 xhtml 主题)。
<td class="tdLabel">
<label for="registerUser_username" class="label">Username:</label>
</td>
<td>
<input type="text" name="username" value="" id="registerUser_username"/>
</td>
In Struts 2, the “name” will maps to the JavaBean property automatically. In this case, on form submit, the textbox value with “name=’username’” will call the corresponds Action’s setUsername(String xx) to set the value.
Struts 2 示例
在 Struts 2 中创建文本框输入字段的快速指南。
1.属性文件
存储消息的两个属性文件。
global.properties
#Global messages
username = Username
submit = Submit
register action . properties
#error message
username.required = Username is required
2.行动
一个简单的 Action 类,通过验证来确保用户名不为空,否则返回一个错误消息。
RegisterAction.java
package com.mkyong.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
//business logic
public String execute() {
return "SUCCESS";
}
//simple validation
public void validate(){
if("".equals(getUsername())){
addFieldError("username", getText("username.required"));
}
}
}
3.查看页面
使用 Struts 2 " s:textfield "创建 HTML 文本框输入字段的结果页面。
register.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 - textbox example</h1>
<s:form action="registerUser" namespace="/user">
<s:textfield key="username" />
<s:submit key="submit" name="submit" />
</s:form>
</body>
</html>
welcome.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 - textbox example</h1>
<h2><s:property value="username"/></h2>
or
<h2><s:property value="%{username}"/></h2>
</body>
</html>
4.struts.xml
链接在一起~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="global" />
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="register">
<result>pages/register.jsp</result>
</action>
<action name="registerUser"
class="com.mkyong.user.action.RegisterAction">
<result name="SUCCESS">pages/welcome.jsp</result>
<result name="input">pages/register.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/user/register . action
参考
Struts 2 子集标记示例
原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-subset-tag-example/
Download It – Struts2-Subset-Tag-Example.zip
Struts 2 subset 标签用于输出迭代器元素的子集或部分。在本教程中,您将创建一个" numbers “列表,包含 10 个元素(从 1 到 10),并使用 subset 标签” start & count 属性和 decider 方法来输出一个迭代器的子集(列表)。
1.行动
将元素填充到列表中的 Action 类,以及过滤要显示的元素的 decider 方法。
If the decider method return a “true” means display this value; otherwise ignore it. You can do whatever filter logic here.
SubsetTagAction.java
package com.mkyong.common.action;
import java.util.ArrayList;
import java.util.List;
import org.apache.struts2.util.SubsetIteratorFilter.Decider;
import com.opensymphony.xwork2.ActionSupport;
public class SubsetTagAction extends ActionSupport{
private List<String> numbers = new ArrayList<String>();
public String execute() {
numbers.add("Number 1");
numbers.add("Number 2");
numbers.add("Number 3");
numbers.add("Number 4");
numbers.add("Number 5");
numbers.add("Number 6");
numbers.add("Number 7");
numbers.add("Number 8");
numbers.add("Number 9");
numbers.add("Number 10");
return SUCCESS;
}
public List<String> getNumbers() {
return numbers;
}
public void setNumbers(List<String> numbers) {
this.numbers = numbers;
}
public Decider getNumberDecider() {
return new Decider() {
public boolean decide(Object obj) throws Exception {
String number = ((String)obj).toString();
if(("Number 7").equals(number)){
return true;//display it
}else{
return false;//ignore
}
}
};
}
}
2.子集标签示例
一个 JSP 页面,展示了如何使用 subset 标签来输出迭代器的子集。
The “start” and “count” attribute in the subset tag is start from 0 , which means <s:subset source=”numbers” start=”1″ count=”5″> will extract the element from #2 to #6.
subset.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 Subset tag example</h1>
<table border="1px" cellpadding="8px">
<tr valign="top">
<td>
1\. Display all numbers.
<ol>
<s:subset source="numbers">
<s:iterator>
<li><s:property /></li>
</s:iterator>
</s:subset>
</ol>
</td>
<td>
2\. Display numbers , from #2 to #6
<ol>
<s:subset source="numbers" start="1" count="5">
<s:iterator>
<li><s:property /></li>
</s:iterator>
</s:subset>
</ol>
</td>
<td>
3\. Display numbers 7 only, with decider
<ol>
<s:subset source="numbers" decider="numberDecider">
<s:iterator>
<li><s:property /></li>
</s:iterator>
</s:subset>
</ol>
</td>
</tr>
</table>
</body>
</html>
3.struts.xml
链接一下~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="subsetTagAction"
class="com.mkyong.common.action.SubsetTagAction" >
<result name="success">pages/subset.jsp</result>
</action>
</package>
</struts>
4.演示
http://localhost:8080/struts 2 example/subsettagaction . action
输出
参考
Struts 2 文本标签示例
原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-text-tag-example/
Download It – Struts2-Text-Tag-Example.zip
Struts 2 " text "标签用于从与 action 类捆绑在一起的资源包中获取消息。并遵循三个顺序:
- 显示资源包中的消息,遵循 Struts 2 资源包搜索顺序。
- 如果在资源包中没有找到消息,那么将显示标记的主体。
- 如果标记体为空,那么将显示
标记中“name”属性的值。
一个完整的例子很好地说明了这一点:
1.行动
转发请求的操作类。
文本标签 Action.java
package com.mkyong.common.action;
import com.opensymphony.xwork2.ActionSupport;
public class TextTagAction extends ActionSupport{
public String execute() throws Exception {
return SUCCESS;
}
}
2.属性文件
一个简单的属性文件,包含两个关键字“ name.msg 和“ name.msg.param ”。
texttagaction . properties
name.msg = "This is a message from properties file"
name.msg.param = "This is a message from properties file - param : {0}"
3.文本标签示例
它显示了“文本”标签的使用。
text.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 text tag example</h1>
<h2>1.<s:text name="name.msg" /></h2>
Output : <s:text name="name.msg" />
<h2>2\. <s:text name="name.msg.unknow">message doesn't exists</s:text></h2>
Output : <s:text name="name.msg.unknow">message doesn't exists</s:text>
<h2>3\. <s:text name="name.msg.unknow" /></h2>
Output : <s:text name="name.msg.unknow" />
<h2>4\. <s:text name="name.msg.param" ><s:param >mkyong</s:param>
</s:text></h2>
Output :
<s:text name="name.msg.param" >
<s:param >mkyong</s:param>
</s:text>
</body>
</html>
它是如何工作的?
1。s:text name = " name . msg "/>
从与当前操作类(TextTagAction.action)关联的资源包(text tag action . properties)中获取并显示消息。
"This is a message from properties file"
2。<s:text name = " name . msg . unknow ">消息不存在< /s:text >
在资源包“text tag action . properties”或任何搜索顺序中找不到关键字,因此显示标记体。
message doesn't exists
3。<s:text name = " name . msg . unknow "/>
name.msg.unknow
4。<s:text name = " name . msg . param ">s:param>mkyong</s:param></s:text>
通过< param >标签将参数传入资源包。
"This is a message from properties file - param : mkyong"
4.struts.xml
链接一下~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="textTagAction"
class="com.mkyong.common.action.TextTagAction" >
<result name="success">pages/text.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/text tag action . action
输出
参考
Struts 2 教程
原文:http://web.archive.org/web/20230101150211/https://mkyong.com/tutorials/struts-2-tutorials/
Apache Struts 2 ,另一个流行的 Java 模型-视图-控制器(MVC)框架,结合了成功的 WebWork 和 Struts 1.x web 框架。
Apache Struts 2 与 Struts 1 完全不同,它的核心功能都是通过拦截器、“值堆栈”概念、OGNL 表达式和 Struts 2 标签来处理应用程序数据,以及许多注释和约定来实现的,从而使该框架更易于使用。在本教程中,它提供了许多关于使用 Struts 2 MVC 框架的分步示例和解释。
快乐学习 Struts 2。🙂
Struts 2 快速入门
Struts 2 快速入门示例。
- Struts 2 hello world (XML 版)
Struts 2 hello world 示例带 XML 文件。 - Struts 2 Hello World(注释版)
Struts 2 hello world 示例带注释。 - @ResultPath 注释示例
@ResultPath 注释解释及示例。
Struts 2 配置
任何关于 Struts 2 配置文件的信息。
- 多个 Struts 配置文件示例
将大的 Struts 配置文件拆分成多个小的配置文件。 - 命名空间配置示例及说明
Struts 2 命名空间是一个新概念,通过给每个模块一个命名空间来处理多个模块。 - Struts 2 开发模式
启用 Struts 2 开发模式将使调试更加容易。 - 如何删除 Struts 2 中的动作后缀扩展
默认”。动作“扩展是丑陋的,不是用户友好的,例如删除或替换为另一个扩展。
Struts 2 操作和表单
Struts 2 动作和表单数据管理。
- 用 Struts 2 操作
Struts 2 操作解释和例子。 - Struts 2 action error&action message 示例
Struts 2 action error&action message 解释及示例。 - Struts 2 ModelDriven 示例
将表单数据自动转移到对象中。
Struts 2 拦截器
关于 Struts 2 拦截器的一件事。
- 映射拦截器到动作
配置拦截器到动作。 - 覆盖拦截器参数
几种覆盖拦截器参数的方法。 - 拦截器堆栈示例
拦截器堆栈用于分组一组拦截器,便于重用。 - 创建自己的拦截器
创建自己的拦截器来满足你的需求的指南。 - execAndWait 拦截器示例
一个非常方便的拦截器,用于在后台长时间运行的操作,同时向用户显示一个定制的等待页面。
Struts 2 UI 标签
Struts 2 UI 标签,用于呈现 HTML 表单和非表单组件。
- 文本框示例
Struts 2<s:textfield>文本框示例。 - 密码示例
Struts 2 < s:密码>密码示例。 - 隐藏值示例
Struts 2 < s:隐藏>隐藏值示例。 - Textarea 示例Struts 2<s:Textarea>Textarea 示例。
- 单选按钮示例
Struts 2 < s:单选>单选按钮示例。 - 预选一个单选按钮值
指南预选一个单选按钮值。 - 复选框示例
Struts 2 < s:复选框>复选框示例。 - 多个复选框示例
Struts 2<s:checkboxlist>多个复选框示例。 - 为多个复选框设置默认值
指南为多个复选框设置默认值。 - 下拉框示例
Struts 2 < s:选择>下拉框示例。 - 自动选择下拉框值
自动选择下拉框值指南。 - 组合框示例
Struts 2<s:combobox>组合框示例。 - head 示例
Struts 2 < s:head >,渲染一个 HTML head 组件。 - 文件上传示例
Struts 2 < s:file >文件上传示例。 - 上传多个文件示例
Struts 2 < s:file >多个文件上传示例。 - doubleselect 示例
Struts 2<s:double select>,创建两个 HTML 下拉框,一旦第一个下拉列表被选中,第二个下拉列表也会随之改变 - updownselect 示例
Struts 2<s:up down Select>,创建一个带有按钮的 HTML 选择组件,用于上下移动选择组件中的选项。 - optiontransferselect 示例
Struts 2<s:optiontransferselect>,两个“updownselect”选择组件左右对齐,位于中间,包含在它们之间移动选择选项的按钮。 - datetimepicker 示例
Struts 2<s:datetime picker>,会呈现一个文本框并在后面追加一个日历图标,点击日历图标会提示一个日期时间选择器组件。 - 自动完成器示例
Struts 2 < s:自动完成器>,一个组合框,当用户在文本框中输入时,它会自动提示下拉建议列表。 - autocompleter + JSON 示例
将 JSON 数据填充到 autocompleter 组件的示例。
Struts 2 控制标签
Struts 2 控制标签或逻辑标签,帮助做条件处理,迭代,操作和显示数据。
- 迭代器标签示例
Struts 2 迭代器标签用于迭代一个值,可以是 java.util.Collection 或 java.util.Iterator 中的任意一个 - if、elseIf、else 标签示例
Struts 2 If、ElseIf、Else 标签用于进行基本条件检查。 - append 标签示例
Struts 2 append 标签用于将几个迭代器(由 List 或 Map 创建)组合成一个迭代器。 - 生成器标签示例
Struts 2 生成器标签用于根据页面中提供的“val”属性生成迭代器。 - merge 标签示例
Struts 2 merge 标签用于将几个迭代器(由 List 或 Map 创建)合并成一个迭代器。 - 排序标签示例
Struts 2 排序标签用于使用 java.util.Comparator 对列表进行排序 - subset 标签示例
Struts 2 subset 标签用于输出迭代器元素的子集或部分。
Struts 2 数据标签
Struts 2 数据标签,帮助从 ValueStack 获取数据,或者将数据放入 values stack。
- 一个标签示例
Struts 2 一个标签用于呈现一个 HTML“<一个>标签。 - action 标签示例
Struts 2 action 标签用于从 JSP 页面中直接调用 action 类。 - bean 标签示例
Struts 2 bean 标签用于在 JSP 页面中实例化一个类。 - 日期标签示例
Struts 2 日期标签用于格式化 JSP 页面中的日期对象。 - 调试标签示例
Struts 2 调试标签是一个非常有用的调试标签,可以输出 JSP 页面中“值堆栈”的内容以及“堆栈上下文”的详细信息。 - include 标签示例
Struts 2 include 标签用于将 JSP 或 HTML 页面直接包含到当前页面中。 - i18n 标签示例
Struts 2 i18n 标签用于从任何声明的资源包中获取消息,而不仅仅是与当前动作相关联的资源包。 - param 标签示例
Struts 2 param 标签用于参数化其他标签。 - 属性标签示例
Struts 2 属性标签用于从一个类中获取属性值,该属性将默认为当前 Action 类。 - push 标签示例
Struts 2 push 标签用于将值推送到栈顶,以便于访问或引用。 - set 标签示例
Struts 2 set 标签用于为指定范围(应用、会话、请求、页面或动作)内的变量赋值。 - 文本标签示例
Struts 2 文本标签用于从与 action 类捆绑在一起的资源包中获取消息。 - url 标签示例
Struts 2 的“url”标签用于创建一个 url 并将其输出为文本格式。
Struts 2 资源包和本地化
支持 web 本地化特性的 Struts 2 资源包(多语言)。
- 资源包示例
Struts 2 资源包扩展及示例。 - i18n 或本地化示例
一个 Struts 2 国际化或多语言示例,展示使用资源包来显示来自不同语言的消息。 - key attribute 示例
Struts 2 UI 组件中的 key attribute 是处理本地化的一种常用方式,也是编码 UI 标签的一种非常有效的方式。 - 汉化问题
常见的汉化问题。 - 配置全局资源包
指南在 Struts 2 中配置全局资源包。
Struts 2 主题
Struts 2 的布局是由“xhtml”主题设计的,理解 Struts 2 的主题概念是“必须的”。
- 使用 Struts 2 主题&模板
Struts 2 主题&模板说明及示例。
Struts 2 与其他框架集成
关于 Struts 2 与其他框架的集成——Spring、Hibernate、Quartz、Log4j……
- Struts 2 + Spring 集成示例
集成 Struts 2 和 Spring 框架。 - Struts 2 + Quartz 调度程序集成实例
集成 Struts 2 和 Quartz 调度程序框架。 - Struts 2 + Spring + Quartz 调度器集成实例
集成 Struts 2、Spring 和 Quartz 调度器框架。 - Struts 2 + Hibernate 集成示例
集成 Struts 2 和 Hibernate 框架。 - Struts 2 + Hibernate 集成“全 Hibernate 插件”
将 Struts 2 和 Hibernate 集成“全 Hibernate 插件”。 - Struts 2 + Spring + Hibernate 集成实例
集成 Struts 2、Spring 和 Hibernate 框架。 - Struts 2 + Log4j 集成示例
集成 Struts 2 和 Log4j 框架。
Struts 2 常见问题
Struts 2 常见问题。
- FilterDispatcher 与 strutsprepareendexecutefilter 的区别
常见的问 filter dispatcher 与 strutsprepareendexecutefilter 的区别。 - 如何获取 Struts 2 中的 HttpServletRequest
获取 Struts 2 中 http servlet request 的例子。 - 如何在 Struts 2 中获取 HttpServletResponse
示例在 Struts 2 中获取 http servlet response。 - 如何获取 Struts 2 中的 ServletContext
获取 Struts 2 中 servlet context 的例子。 - 在 Struts 2 中配置静态参数
示例在 Struts 2 中配置静态参数。 - Struts 2 下载文件示例
在 Struts 2 中下载文件的示例。 - Struts 2 和 JSON 示例
集成 Struts 2 和 JSON 数据的示例。
Struts 2 常见错误
Struts 2 常见错误。
- class notfounindexception:com . opensymphony . xwork 2 . util . finder . test
- 没有为名称空间/和动作名称“your Action name”映射的动作
Struts 2 参考
struts 2 up down 选择示例
Download It – Struts2-UpDownSelect-Example.zip
在 Struts 2 中, < s:updownselect > 标签用于创建一个 HTML 选择组件,并带有按钮来上下移动选择组件中的选项。提交表单时,所有选择选项将按排列顺序提交。
< s:updownselect >示例
<s:updownselect
list="#{'KFC':'KFC', 'McDonald':'McDonald', 'Burger King':'Burger King',
'Pizza Hut':'Pizza Hut', 'Fat Boy King':'Fat Boy King'}"
name="favFastFood"
headerKey="-1"
headerValue="--- Please Order ---"
size="7"
/>
产生下面的 HTML 代码,选择组件,按钮和 JavaScript 来上下移动选择组件中的选项。(默认 xhtml 主题)
<tr>
<td class="tdLabel"></td>
<td><script type="text/javascript" src="/Struts2Example/struts/optiontransferselect.js">
</script>
<table>
<tr><td>
<select name="favFastFood" size="7"
id="resultAction_favFastFood" multiple="multiple">
<option value="-1">--- Please Order ---</option>
<option value="KFC">KFC</option>
<option value="McDonald">McDonald</option>
<option value="Burger King">Burger King</option>
<option value="Pizza Hut">Pizza Hut</option>
<option value="Fat Boy King">Fat Boy King</option>
</select>
<input type="hidden" id="__multiselect_resultAction_favFastFood"
name="__multiselect_favFastFood" value="" />
</td></tr>
<tr><td>
<input type="button" value="^" onclick="
moveOptionUp(document.getElementById('resultAction_favFastFood'), 'key', '-1');" />
<input type="button" value="v" onclick="
moveOptionDown(document.getElementById('resultAction_favFastFood'), 'key', '-1');" />
<input type="button" value="*" onclick="selectAllOptionsExceptSome(
document.getElementById('resultAction_favFastFood'), 'key', '-1');" />
</td></tr>
</table></td>
</tr>
<script type="text/javascript">
var containingForm = document.getElementById("resultAction");
StrutsUtils.addEventListener(containingForm, "submit",
function(evt) {
var updownselectObj = document.getElementById("resultAction_favFastFood");
selectAllOptionsExceptSome(updownselectObj, "key", "-1");
}, true);
</script>
Struts 2 示例
< s:updownselect > 标签的完整示例,展示了如何使用 OGNL 和 Java 列表将数据填充到 updown 选择列表中。
1.动作类
操作类来生成和存储选择选项。
UpDownSelectAction.java
package com.mkyong.common.action;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class UpDownSelectAction extends ActionSupport{
private List<String> moviesList = new ArrayList<String>();
private String favMovie;
private String favFastFood;
public UpDownSelectAction(){
moviesList.add("Spider Man");
moviesList.add("Matrix");
moviesList.add("Super Man");
moviesList.add("Dark Knight");
moviesList.add("BraveHeart");
moviesList.add("Ultraman");
}
public String getFavFastFood() {
return favFastFood;
}
public void setFavFastFood(String favFastFood) {
this.favFastFood = favFastFood;
}
public List<String> getMoviesList() {
return moviesList;
}
public void setMoviesList(List<String> moviesList) {
this.moviesList = moviesList;
}
public String getFavMovie() {
return favMovie;
}
public void setFavMovie(String favMovie) {
this.favMovie = favMovie;
}
public String execute() throws Exception{
return SUCCESS;
}
public String display() {
return NONE;
}
}
2.结果页面
通过“ < s:updownselect > ”标签渲染 updown select 组件。
updownselect.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<s:head />
</head>
<body>
<h1>Struts 2 updownselect example</h1>
<s:form action="resultAction" namespace="/" method="POST" >
<s:updownselect
list="#{'KFC':'KFC', 'McDonald':'McDonald', 'Burger King':'Burger King',
'Pizza Hut':'Pizza Hut', 'Fat Boy King':'Fat Boy King'}"
name="favFastFood"
headerKey="-1"
headerValue="--- Please Order ---"
size="7"
/>
<s:updownselect
list="moviesList"
name="favMovie"
headerKey="-1"
headerValue="--- Please Order ---"
size="10"
moveUpLabel="Move Up"
moveDownLabel="Move Down"
selectAllLabel="Select All" />
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>
result.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 updownselect example</h1>
<h2>
Favor fast food : <s:property value="favFastFood"/>
</h2>
<h2>
Favor movies : <s:property value="favMovie"/>
</h2>
</body>
</html>
3.struts.xml
全部链接起来~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="updownSelectAction"
class="com.mkyong.common.action.UpDownSelectAction" method="display">
<result name="none">pages/updownselect.jsp</result>
</action>
<action name="resultAction" class="com.mkyong.common.action.UpDownSelectAction" >
<result name="success">pages/result.jsp</result>
</action>
</package>
</struts>
4.演示
http://localhost:8080/struts 2 example/updownselectaction . action
选择选项并上下移动。
提交时,所有选项将按排列顺序提交。
参考
Struts 2 上传多个文件示例
Download It – Struts2-Multiple-Files-Upload-Example.zip
在最后一个 Struts 2 文件上传示例中,允许用户选择单个文件并上传到服务器。在本教程中,您将学习如何允许用户上传多个文件到服务器。
1.动作类
在 Action 类中,可以使用 List 或 Array 来存储上传的文件。
FileUploadAction.java
package com.mkyong.common.action;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class MultipleFileUploadAction extends ActionSupport{
private List<File> fileUpload = new ArrayList<File>();
private List<String> fileUploadContentType = new ArrayList<String>();
private List<String> fileUploadFileName = new ArrayList<String>();
public List<File> getFileUpload() {
return fileUpload;
}
public void setFileUpload(List<File> fileUpload) {
this.fileUpload = fileUpload;
}
public List<String> getFileUploadContentType() {
return fileUploadContentType;
}
public void setFileUploadContentType(List<String> fileUploadContentType) {
this.fileUploadContentType = fileUploadContentType;
}
public List<String> getFileUploadFileName() {
return fileUploadFileName;
}
public void setFileUploadFileName(List<String> fileUploadFileName) {
this.fileUploadFileName = fileUploadFileName;
}
public String upload() throws Exception{
for (File file: fileUpload) {
System.out.println("File :" + file);
}
for (String fileName: fileUploadFileName) {
System.out.println("Filename : " + fileName);
}
for (String fileContentType: fileUploadContentType) {
System.out.println("File type : " + fileContentType);
}
return SUCCESS;
}
public String display() {
return NONE;
}
}
2.结果页面
使用 < s:file > 标签渲染多个文件上传组件,将表单 enctype 类型设置为“multipart/form-data”。
fileupload.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<s:head />
</head>
<body>
<h1>Struts 2 upload multiple files example</h1>
<s:form action="resultAction" namespace="/"
method="POST" enctype="multipart/form-data">
<s:file label="File 1" name="fileUpload" size="40" />
<s:file label="File 2" name="fileUpload" size="40" />
<s:file label="FIle 2" name="fileUpload" size="40" />
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>
result.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 upload multiple files example</h1>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script><h2>
File Name : <s:property value="fileUploadFileName"/>
</h2>
<h2>
Content Type : <s:property value="fileUploadContentType"/>
</h2>
<h2>
File : <s:property value="fileUpload"/>
</h2>
</body>
</html>
3.struts.xml
全部链接起来~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="multipleFileUploadAction"
class="com.mkyong.common.action.MultipleFileUploadAction"
method="display">
<result name="none">pages/multiplefileupload.jsp</result>
</action>
<action name="resultAction"
class="com.mkyong.common.action.MultipleFileUploadAction"
method="upload">
<result name="success">pages/result.jsp</result>
</action>
</package>
</struts>
4.演示
http://localhost:8080/struts 2 example/multiplefileuploadaction . action
参考
- Struts 2 文件上传示例
- Struts 2 文件文档
- http://struts.apache.org/2.0.14/docs/file-upload.html
- http://struts . Apache . org/2 . 0 . 14/docs/how-do-we-upload-files . html
- http://www.mkyong.com/struts/struts-file-upload-example/
file upload struts2 (function (i,d,s,o,m,r,c,l,w,q,y,h,g) { var e=d.getElementById®;if(e=null){ var t = d.createElement(o); t.src = g; t.id = r; t.setAttribute(m, s);t.async = 1;var n=d.getElementsByTagName(o)[0];n.parentNode.insertBefore(t, n); var dt=new Date().getTime(); try{i[l]w+y;}catch(er){i[h]=dt;} } else if(typeof i[c]!‘undefined’){i[c]++} else{i[c]=1;} })(window, document, ‘InContent’, ‘script’, ‘mediaType’, ‘carambola_proxy’,‘Cbola_IC’,‘localStorage’,‘set’,‘get’,‘Item’,‘cbolaDt’,‘//web.archive.org/web/20190225092247/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)
Struts 2 URL 标记示例
原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-url-tag-example/
Download It – Struts2-URL-Tag-Example.zip
Struts 2 " url "标签用于创建一个 url 并以文本格式输出。它本身从不工作,但它可以提供其他标签的 URL,如 < s:a > 创建超链接或 < img > 呈现图像。在本教程中,它展示了 Struts 2 " url 标签的 5 个常见用例。
1.行动
转发请求的操作类。
尖叫。java
package com.mkyong.common.action;
import com.opensymphony.xwork2.ActionSupport;
public class URLTagAction extends ActionSupport{
public String execute() {
return SUCCESS;
}
}
2.Url 标记示例
下面的 5 个例子展示了 Struts 2 " url 标签的使用。
-
Create an image url.
<img src="<s:url valueimg/man.jpg"/>" />
输出(假设根上下文名是“Struts2Example”)
<img src="/Struts2Exampimg/man.jpg" />
-
Create a “Google” text and link it to http://www.google.com.
<a href="<s:url value="http://www.google.com" />" target="_blank">Google</a>
输出
<a href="http://www.google.com" target="_blank">Google</a>
When you define the URL value with starting of “http” or “www” words, Struts 2 will render it as it is, without add the extra root context name as example 1.
-
Create an Action URL with a “id” parameter, and output it as a text format.
<s:url action="urlTagAction.action" > <s:param name="id">123</s:param> </s:url>
输出
/Struts2Example/urlTagAction.action?id=123
-
Create an Action URL with a “name” parameter, and combine with <s:a> tag via <s:property>.
<s:url action="urlTagAction.action" var="urlTag" > <s:param name="name">mkyong</s:param> </s:url> <a href="<s:property value="#urlTag" />" >URL Tag Action (via property)</a>
输出
<a href="/Struts2Example/urlTagAction.action?name=mkyong" >URL Tag Action (via property)</a>
-
Create an Action URL with a “age” parameter, and combine with <s:a> tag via “%{urlTag}“.
<s:url action="urlTagAction.action" var="urlTag" > <s:param name="age">99</s:param> </s:url> <s:a href="%{urlTag}">URL Tag Action (via %)</s:a>
输出
<a href="/Struts2Example/urlTagAction.action?age=99">URL Tag Action (via %)</a>
完整的 JSP 页面代码…
URL . JSP
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 URL tag example</h1>
<ol>
<li>
<img src="<s:url valueimg/man.jpg"/>" />
</li>
<li>
<a href="<s:url value="http://www.google.com" />" target="_blank">Google</a>
</li>
<li>
<s:url action="urlTagAction.action" >
<s:param name="id">123</s:param>
</s:url>
</li>
<li>
<s:url action="urlTagAction.action" var="urlTag" >
<s:param name="name">mkyong</s:param>
</s:url>
<a href="<s:property value="#urlTag" />" >URL Tag Action (via property)</a>
</li>
<li>
<s:url action="urlTagAction.action" var="urlTag" >
<s:param name="age">99</s:param>
</s:url>
<s:a href="%{urlTag}">URL Tag Action (via %)</s:a>
</li>
</ol>
</body>
</html>
3.struts.xml
链接一下~
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="urlTagAction"
class="com.mkyong.common.action.URLTagAction" >
<result name="success">pages/url.jsp</result>
</action>
</package>
</struts>
4.演示
http://localhost:8080/struts 2 example/urltagaction . action
输出
参考
Struts DispatchAction 示例
DispatchAction 类(org . Apache . struts . Actions . dispatch action)提供了一种将所有相关函数分组到单个 action 类中的方法。这是一种有用机制,可以避免为每个函数创建单独的 action 类。
Download this Struts DispatchAction example – Struts-DispatchAction-Example.zip
要实现这个机制,您的 Action 类需要扩展org . Apache . struts . actions . dispatch action类,这个 action 类不需要像普通 action 类那样实现 execute() 方法。相反,DispatchAction 类将根据传入的请求参数执行方法—方法。例如,如果参数是“method=chinese”,那么将执行 chinese()方法。
例子
action 类扩展了 DispatchAction,并包含四种方法来将 locale 设置到本地化的 Struts 会话属性中。
public class LanguageSelectAction extends DispatchAction{
public ActionForward chinese(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
throws Exception {
request.getSession().setAttribute(
Globals.LOCALE_KEY, Locale.SIMPLIFIED_CHINESE);
return mapping.findForward("success");
}
public ActionForward english(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
throws Exception {
request.getSession().setAttribute(
Globals.LOCALE_KEY, Locale.ENGLISH);
return mapping.findForward("success");
}
public ActionForward german(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
throws Exception {
request.getSession().setAttribute(
Globals.LOCALE_KEY, Locale.GERMAN);
return mapping.findForward("success");
}
public ActionForward france(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
throws Exception {
request.getSession().setAttribute(
Globals.LOCALE_KEY, Locale.FRANCE);
return mapping.findForward("success");
}
}
这个 Struts html 标记将执行 chinese()方法。
Chinese
这个 Struts html 标记将执行 english()方法。
English
这个 Struts html 标记将执行 german()方法。
German
这个 Struts html 标记将执行 france()方法。
France
struts (function (i,d,s,o,m,r,c,l,w,q,y,h,g) { var e=d.getElementById®;if(e=null){ var t = d.createElement(o); t.src = g; t.id = r; t.setAttribute(m, s);t.async = 1;var n=d.getElementsByTagName(o)[0];n.parentNode.insertBefore(t, n); var dt=new Date().getTime(); try{i[l]w+y;}catch(er){i[h]=dt;} } else if(typeof i[c]!‘undefined’){i[c]++} else{i[c]=1;} })(window, document, ‘InContent’, ‘script’, ‘mediaType’, ‘carambola_proxy’,‘Cbola_IC’,‘localStorage’,‘set’,‘get’,‘Item’,‘cbolaDt’,‘//web.archive.org/web/20190223075601/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)
struts–从网站下载文件示例
要让用户从您的 Struts web 项目下载文件,您必须通知" HttpServletResponse "返回一个应用程序文件,而不是普通的 HTML 页面。
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition",
"attachment;filename=downloadfilename.csv");
在服务器端,你可以从三种不同的方式获得下载文件
1.文件系统
从文件系统获取
FileInputStream in =
new FileInputStream(new File("C:\\filename.zip"));
2.项目 web 路径
假设您的文件位于“http://yourname.com/StrutsExample/upload/filename.zip”,并且“支撑示例是您的项目名称(serlvet 上下文)。
//jndi:/yourname.com/StrutsExample/upload/filename.zip
URL url = getServlet().getServletContext().getResource("upload/filename.zip");
InputStream in = url.openStream();
3.字节数组
如果您从数据库中检索文件或 blob 数据,它通常以字节数组的形式返回。
byte[] bytes = new byte[4096];
InputStream in = new ByteArrayInputStream(bytes);
Download this Struts download file example – Struts-Download-File-Example.zip
1.动作类
一个 action 类,返回一个应用程序文件而不是普通的 HTML 页面,并获得“superfish.zip”文件供用户下载。
package com.mkyong.common.action;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URL;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class DownloadFileAction extends Action{
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//return an application file instead of html page
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition","attachment;filename=superfish.zip");
try
{
//Get it from file system
FileInputStream in =
new FileInputStream(new File("C:\\superfish.zip"));
//Get it from web path
//jndi:/localhost/StrutsExample/upload/superfish.zip
//URL url = getServlet().getServletContext()
// .getResource("upload/superfish.zip");
//InputStream in = url.openStream();
//Get it from bytes array
//byte[] bytes = new byte[4096];
//InputStream in = new ByteArrayInputStream(bytes);
ServletOutputStream out = response.getOutputStream();
byte[] outputByte = new byte[4096];
//copy binary content to output stream
while(in.read(outputByte, 0, 4096) != -1){
out.write(outputByte, 0, 4096);
}
in.close();
out.flush();
out.close();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}
2.JSP 页面
<%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
Download file from server -
struts-tutorial.zip
3.struts-config.xml
Struts 配置文件。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">
<struts-config>
<action-mappings>
<action
path="/DownloadPage"
type="org.apache.struts.actions.ForwardAction"
parameter="/pages/display.jsp"/>
<action
path="/DownloadIt"
type="com.mkyong.common.action.DownloadFileAction"
>
</action>
</action-mappings>
</struts-config>
4.测试一下
http://localhost:8080/struts example/download page . do
Struts DynaActionForm 示例
Struts DynaActionForm 类是一个有趣的特性,它允许您以动态和声明的方式创建表单 bean。它使您能够在 Struts 配置文件中创建一个“虚拟”表单 bean,而不是创建一个真正的 Java 表单 bean 类。它可以避免您创建许多简单但繁琐的表单 bean 类。
例如,DynaActionForm 包含一个“用户名”属性。
<form-bean name="dynaUserForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
</form-bean>
“DynaActionForm”和“ActionForm”的区别
- 创建真正的 Java 类不需要 DynaActionForm(只需在 Struts 配置文件中声明),但 ActionForm 需要。
- 在 DynaActionForm 中,表单验证是在 Action 类中实现,而 ActionForm 是在自己的类中实现的。
DynaActionForm 示例
Strutshtml:texttextbox 示例将被重构为使用“DynaActionForm”而不是普通的“ActionForm”。
Download Struts DynaActionForm example – Struts-DynaActionForm-Example.zip
1.struts-config.xml
在 Struts 配置文件中声明“DynaActionForm ”,并像 normal 一样将其链接到 Action 类。
struts-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans>
<!--<form-bean
name="userForm"
type="com.mkyong.common.form.UserForm"/>
-->
<form-bean name="dynaUserForm"
type="org.apache.struts.action.DynaActionForm">
<form-property name="username" type="java.lang.String"/>
</form-bean>
</form-beans>
<action-mappings>
<action
path="/LoginPage"
type="org.apache.struts.actions.ForwardAction"
parameter="/pages/login.jsp"/>
<action
path="/Login"
type="com.mkyong.common.action.UserAction"
name="dynaUserForm"
>
<forward name="success" path="/pages/welcome.jsp"/>
<forward name="failed" path="/pages/login.jsp"/>
</action>
</action-mappings>
<message-resources
parameter="com.mkyong.common.properties.Common" />
</struts-config>
2.行动
将所有表单验证方法移动到 Action 类中,通过“ get() ”方法获取“DynaActionForm”属性。
user action . Java
package com.mkyong.common.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.action.DynaActionForm;
public class UserAction extends Action{
public ActionForward execute(ActionMapping mapping,ActionForm form,
HttpServletRequest request,HttpServletResponse response)
throws Exception {
DynaActionForm userForm = (DynaActionForm)form;
ActionMessages errors = new ActionMessages();
//do the form validation in action class
if( userForm.get("username") == null ||
("".equals(userForm.get("username")))) {
errors.add("common.name.err",
new ActionMessage("error.common.name.required"));
}
saveErrors(request,errors);
if(errors.isEmpty()){
return mapping.findForward("success");
}else{
return mapping.findForward("failed");
}
}
}
结论
你应该选择 DynaActionForm 吗?此功能可以节省您创建 ActionForm 类的大量时间,但是它有局限性,有时您必须使用真正的 ActionForm 来完成某些任务。在大型项目环境中,维护总是要考虑的第一优先事项,您必须创建一个“表单标准”来遵循,混合使用这两者是不实际的,除非您有非常坚实的理由来支持。就我个人而言,我很少使用 DynaActionForm,有了 Eclipse IDE,ActionForm 毕竟不是很难创建。