原文:Mkyong
Struts 2 @ResultPath 注释示例
在 Struts 2 中, @ResultPath 注释用于控制 Struts 2 将在哪里找到存储的结果或 JSP 页面。默认情况下,它会从“ WEB-INF/content/ ”文件夹中找到结果页面。
No idea why the Struts 2 annotation set the “WEB-INF/content/” as default folder, but most applications will not put the result pages in this “WEB-INF/content/” folder. It’s just a Struts 2 convention not a standard folder structure. I rather Struts 2 put the root path as the default folder.
@ResultPath 示例
1.默认结果路径
一个登录动作类,设置为“/用户”命名空间,重定向到“页面/login.jsp ”页面。
假设 Struts2Example 是您的上下文 servlet 名称
@Namespace("/User")
@Result(name="success",location="pages/login.jsp")
public class LoginAction extends ActionSupport{
}
访问它
http://localhost:8080/Struts2Example/User/login.action
Struts 2 将从默认位置找到“login.jsp”结果页面
/Struts2Example/WEB-INF/content/User/pages/login.jsp
2.自定义结果路径
如果您 JSP 结果页面存储在其他位置,您可以使用 @ResultPath 注释对其进行更改。
@Namespace("/User")
@ResultPath(value="/")
@Result(name="success",location="pages/login.jsp")
public class LoginAction extends ActionSupport{
}
再次访问它
http://localhost:8080/Struts2Example/User/login.action
现在,Struts 2 将从不同的位置找到“login.jsp”结果页面
/Struts2Example/User/pages/login.jsp
全局@结果路径
@ResultPath 只适用于类级别。要全局应用它,您可以在 struts.xml 文件中配置它。
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.convention.result.path" value="/"/>
</struts>
参考
Struts 2 复选框示例
Download It – Struts2-CheckBox-Example.zip
在 Struts 2 中,可以使用 < s:checkbox > 标签创建一个 HTML 复选框。 fieldValue=“true” 是复选框将提交的实际值。
<s:checkbox name="checkMe" fieldValue="true" label="Check Me for testing"/>
In common, you do not need to declared the fieldValue=”true”, because true is the default value.
它将生成下面的 HTML。
<input type="checkbox" name="checkMe" value="true" id="xx_checkMe"/>
<input type="hidden" id="__checkbox_xx_checkMe" name="__checkbox_checkMe" value="true"/>
<label for="resultAction_checkMe" class="checkboxLabel">Check Me for testing</label>
预先选择复选框
如果您想要预先选择一个复选框,只需添加一个 value 属性并将其设置为 true。
<s:checkbox name="checkMe" fieldValue="true" value="true" label="Check Me for testing"/>
它将生成下面的 HTML。
<input type="checkbox" name="checkMe" value="true" checked="checked" id="xx_checkMe"/>
<input type="hidden" id="__checkbox_xx_checkMe" name="__checkbox_checkMe" value="true" />
<label for="resultAction_checkMe" class="checkboxLabel">Check Me for testing</label>
Struts 2 < s:复选框> 示例
一个完整的例子,通过 Struts 2**<s:checkbox>**创建复选框,并将提交的复选框值赋给 Action 类并显示。
1.行动
带有用于保存复选框值的 checkMe 布尔属性的操作类。CheckBoxAction.java
T3
package com.mkyong.common.action;
import com.opensymphony.xwork2.ActionSupport;
public class CheckBoxAction extends ActionSupport{
private boolean checkMe;
public boolean isCheckMe() {
return checkMe;
}
public void setCheckMe(boolean checkMe) {
this.checkMe = checkMe;
}
public String execute() {
return SUCCESS;
}
public String display() {
return NONE;
}
}
2.结果页面
使用 Struts 2 " s:checkbox "标记创建复选框的结果页。
checkBox.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 check box example</h1>
<s:form action="resultAction" namespace="/">
<h2>
<s:checkbox name="checkMe" fieldValue="true" label="Check Me for testing"/>
</h2>
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>
result.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 check box example</h1>
<h2>
CheckBox (CheckMe) value : <s:property value="checkMe"/>
</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="checkBoxAction"
class="com.mkyong.common.action.CheckBoxAction" method="display">
<result name="none">pages/checkBox.jsp</result>
</action>
<action name="resultAction" class="com.mkyong.common.action.CheckBoxAction">
<result name="success">pages/result.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/checkbox action . action
http://localhost:8080/struts 2 example/result action . action
参考
Struts 2 多个复选框示例
Download It – Struts2-multiple-checkboxes-example.zip
在 Struts 2 中,可以使用 < s:checkboxlist > 标签来创建多个同名的复选框。唯一关心的是如何在一个变量中保存多个检查值?举个例子,
public List<String> getColors() {
colors = new ArrayList<String>();
colors.add("red");
colors.add("yellow");
colors.add("blue");
colors.add("green");
return colors;
}
<s:checkboxlist label="What's your favor color" list="colors"
name="yourColor" value="defaultColor" />
带有“红色”、“黄色”、“蓝色”和“绿色”选项的多个复选框。如果选中了多个选项,您可以通过一个字符串对象来存储它。
例如,如果选中了“红色”和“黄色”选项,则选中的值将与逗号 yourColor = “red,yellow” 组合。
private String yourColor;
public void setYourColor(String yourColor) {
this.yourColor = yourColor;
}
Read this article about how to set the default value for multiple check boxes.
struts 2**<s:checkbox list>**示例
一个完整的 Struts 2 示例,通过 < s:checkboxlist > 创建多个同名的复选框,存储选中的值并显示在另一个页面中。
1.行动
操作类来生成和保存多个复选框值。
CheckBoxListAction.java
package com.mkyong.common.action;
import java.util.ArrayList;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class CheckBoxListAction extends ActionSupport{
private List<String> colors;
private String yourColor;
public String getYourColor() {
return yourColor;
}
public void setYourColor(String yourColor) {
this.yourColor = yourColor;
}
public CheckBoxListAction(){
colors = new ArrayList<String>();
colors.add("red");
colors.add("yellow");
colors.add("blue");
colors.add("green");
}
public String[] getDefaultColor(){
return new String [] {
"red", "green"};
}
public List<String> getColors() {
return colors;
}
public void setColors(List<String> colors) {
this.colors = colors;
}
public String execute() {
return SUCCESS;
}
public String display() {
return NONE;
}
}
2.结果页面
通过“ s:checkboxlist ”标签呈现多个复选框。checkBoxlist.jsp
T3
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 multiple check boxes example</h1>
<s:form action="resultAction" namespace="/">
<h2>
<s:checkboxlist label="What's your favor color" list="colors"
name="yourColor" value="defaultColor" />
</h2>
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>
result.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 multiple check boxes example</h1>
<h2>
Favor colors : <s:property value="yourColor"/>
</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="checkBoxListAction"
class="com.mkyong.common.action.CheckBoxListAction" method="display">
<result name="none">pages/checkBoxlist.jsp</result>
</action>
<action name="resultAction" class="com.mkyong.common.action.CheckBoxListAction">
<result name="success">pages/result.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/checkboxlistaction . action
http://localhost:8080/struts 2 example/result action . action
参考
Struts 2 示例
Download It – Struts2-Double-Select-Example.zip
在 Struts 2 中, < s:doubleselect > 标签用于创建两个 HTML 下拉框,一旦第一个下拉列表被选中,第二个下拉列表就会相应地改变。一个非常经典的例子是“国家”和“州”下拉选择,其中不同的“州”列表都取决于所选的“国家”。
A < s:doubleselect >标签
<s:doubleselect label="Fruits (OGNL) "
name="fruit1" list="{'fruit','meat'}"
doubleName="fruit2"
doubleList="top == 'fruit' ? {'apple', 'orange','banana'} : {'chicken', 'pig'}" />
产生以下 HTML 代码…
<tr>
<td class="tdLabel">
<label for="resultAction_fruit1" class="label">
Fruits (OGNL) :
</label>
</td>
<td>
<select name="fruit1" id="resultAction_fruit1"
onchange="resultAction_fruit1Redirect(this.options.selectedIndex)">
<option value="fruit">fruit</option>
<option value="meat">meat</option>
</select>
<br />
<select name="fruit2" id="resultAction_fruit2">
</select>
<script type="text/javascript">
var resultAction_fruit1Group = new Array(2 + 0);
for (i = 0; i < (2 + 0); i++)
resultAction_fruit1Group[i] = new Array();
resultAction_fruit1Group[0][0] = new Option("apple", "apple");
resultAction_fruit1Group[0][1] = new Option("orange", "orange");
resultAction_fruit1Group[0][2] = new Option("banana", "banana");
resultAction_fruit1Group[1][0] = new Option("chicken", "chicken");
resultAction_fruit1Group[1][1] = new Option("pig", "pig");
var resultAction_fruit1Temp = document.resultAction.resultAction_fruit2;
resultAction_fruit1Redirect(0);
function resultAction_fruit1Redirect(x) {
var selected = false;
for (m = resultAction_fruit1Temp.options.length - 1; m >= 0; m--) {
resultAction_fruit1Temp.options[m] = null;
}
for (i = 0; i < resultAction_fruit1Group[x].length; i++) {
resultAction_fruit1Temp.options[i] =
new Option(
resultAction_fruit1Group[x][i].text, resultAction_fruit1Group[x][i].value
);
}
if ((resultAction_fruit1Temp.options.length > 0) && (! selected)) {
resultAction_fruit1Temp.options[0].selected = true;
}
}
</script>
</td>
</tr>
嗯, < s:doubleselect > 标签确实是生成了很多代码。它将创建两个下拉列表,许多 JavaScript 的代码来完成后面的魔术(第一次选择,第二次更改),并且还为第一个下拉框附加了一个“ onchange() ”行为。
Look complicated, but simple!
It’s just two <s:select> tags combine in a single tag, see clearly again.
<s:doubleselect
name="" list=""
doubleName="" doubleList="" />
“名称”和“列表是指第一个下拉列表;“双重名称”和“双重列表是指第二个下拉列表。数据填充同“ < s:选择> ”标签。
struts 2**<s:double select>**示例
一个完整的 < s:doubleselect > 标签的例子,展示了使用 OGNL 或 Java 列表来填充下拉列表中的数据。
1.行动
操作类来生成和保存两个下拉列表。
DoubleSelectAction.java
package com.mkyong.common.action;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionSupport;
public class DoubleSelectAction extends ActionSupport{
private String fruit1;
private String fruit2;
private String server1;
private String server2;
private String language1;
private String language2;
Map languageMap;
public String getFruit1() {
return fruit1;
}
public void setFruit1(String fruit1) {
this.fruit1 = fruit1;
}
public String getFruit2() {
return fruit2;
}
public void setFruit2(String fruit2) {
this.fruit2 = fruit2;
}
public String getServer1() {
return server1;
}
public void setServer1(String server1) {
this.server1 = server1;
}
public String getServer2() {
return server2;
}
public void setServer2(String server2) {
this.server2 = server2;
}
public String getLanguage1() {
return language1;
}
public void setLanguage1(String language1) {
this.language1 = language1;
}
public String getLanguage2() {
return language2;
}
public void setLanguage2(String language2) {
this.language2 = language2;
}
public Map getLanguageMap() {
return languageMap;
}
public void setLanguageMap(Map languageMap) {
this.languageMap = languageMap;
}
public DoubleSelectAction(){
languageMap =new HashMap();
languageMap.put("Java",
new ArrayList<String>(Arrays.asList("Spring", "Hibernate", "Struts 2")));
languageMap.put(".Net", new ArrayList<String>(Arrays.asList("VB.Net", "C#")));
languageMap.put("JavaScript", new ArrayList<String>(Arrays.asList("jQuery")));
}
public String execute() {
return SUCCESS;
}
public String display() {
return NONE;
}
}
2.结果页面
通过“ < s:doubleselect > ”标签呈现两个下拉框,通过 Java list 和 OGNL list 填充列表
doubleselect.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 <s:doubleselect> example</h1>
<s:form action="resultAction" namespace="/">
<s:doubleselect label="Fruits (OGNL) "
name="fruit1" list="{'fruit','meat'}"
doubleName="fruit2"
doubleList="top == 'fruit' ? {'apple', 'orange','banana'} : {'chicken', 'pig'}" />
<s:set name="serverList"
value="#{
'AppServer': {
'Apache', 'Tomcat', 'JBoss'},
'Database': {
'Oracle', 'MySQL'}
}" />
<s:doubleselect label="Server (OGNL) "
name="server1" list="#serverList.keySet()"
doubleName="server2" doubleList="#serverList[top]" />
<s:doubleselect label="Language (Java List) "
name="language1" list="languageMap.keySet()"
doubleName="language2" doubleList="languageMap.get(top)" />
<s:submit value="submit" name="submit" />
</s:form>
</body>
</html>
result.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<body>
<h1>Struts 2 <s:doubleselect> example</h1>
<h2>
Test #1 : <s:property value="fruit1"/> , <s:property value="fruit2"/>
</h2>
<h2>
Test #2 : <s:property value="server1"/> , <s:property value="server2"/>
</h2>
<h2>
Test #2 : <s:property value="language1"/> , <s:property value="language2"/>
</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="doubleSelectAction"
class="com.mkyong.common.action.DoubleSelectAction" method="display">
<result name="none">pages/doubleselect.jsp</result>
</action>
<action name="resultAction" class="com.mkyong.common.action.DoubleSelectAction">
<result name="success">pages/result.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/doubleselectaction . action
http://localhost:8080/struts 2 example/result action . action
参考
- Struts 2 双击文档
- 支柱 2 < s:选择>示例
- http://chuanliang2007.spaces.live.com/blog/cns!E5B7AB2851A4C9D2!393 .条目
Struts 2 设置标签示例
原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-set-tag-example/
Download It – Struts2-Set-Tag-Example.zip
Struts 2 " set 标签用于在指定的作用域(应用、会话、请求、页面或动作)中给变量赋值,动作是默认的作用域。参见一个完整的“设置标记示例:
The “value” means any hard-coded String, property value or just anything you can reference.
1.行动
带有“msg”属性的操作类。
SetTagAction.java
package com.mkyong.common.action;
import com.opensymphony.xwork2.ActionSupport;
public class SetTagAction extends ActionSupport{
private String msg = "Struts 2 is a funny framework";
public String getMsg() {
return msg;
}
public String execute() throws Exception {
return SUCCESS;
}
}
2.设置标签示例
它显示了使用“ set 标签。
set.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 set tag example</h1>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
(adsbygoogle = window.adsbygoogle || []).push({
});
</script><h2>1\. <s:set var="varMsg" value="msg" /></h2>
<s:set var="varMsg" value="msg" />
<s:property value="varMsg" />
<h2>2\. <s:set var="varUrl" value="%{'http://www.mkyong.com'}" /></h2>
<s:set var="varUrl" value="%{'http://www.mkyong.com'}" />
<s:property value="varUrl" />
</body>
</html>
它是如何工作的?
1。<s:set var = " varMsg " value = " msg "/>
调用动作的 getMsg() 方法,将返回值赋给一个名为" varMsg "的变量。
2。<s:set var = " varUrl " value = " % { ’ http://www . mkyong . com ’ } "/>
硬编码一个字符串,赋给一个名为" varUrl 的变量。
Assign value to a variable, not property value.
举个例子,
public class SetTagAction extends ActionSupport{
private String msg;
public String setMsg(String msg) {
this.msg = msg;
}
...
<s:set var="msg" value="%{'this is a message'}" />
许多 Struts 2 开发人员认为" set 标签 var=“msg” 会通过 setMsg() 方法将值赋给关联的 action 类。
这是错误的,set 标签不会调用 setMsg() 方法,它只会将“值”赋给一个名为“ msg 的变量,而不是动作的属性值。
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="setTagAction"
class="com.mkyong.common.action.SetTagAction" >
<result name="success">pages/set.jsp</result>
</action>
</package>
</struts>
5.演示
http://localhost:8080/struts 2 example/setta action . action
输出
参考
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/20190304030901/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)
Struts 2 示例
原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-shead-example/
< s:head > 标签用于输出编码、CSS 或 JavaScript 文件等 HTML 头信息。请参见以下片段:
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<s:head />
</head>
<body>
..
假设您使用默认的 xhtml 主题,它将根据" template\xhtml\head.ftl "文件呈现输出
<html>
<head>
<link rel="stylesheet" href="/your_project/struts/xhtml/styles.css" type="text/css"/>
<script src="/your_project/struts/utils.js" type="text/javascript"></script>
</head>
<body>
..
要包含新的 js 或 css 文件,只需将其添加到“ template\xhtml\head.ftl 模板文件中,并通过 < s:head > 标签输出即可。
实际上,这个 < s:head > 标签并不需要放在 HTML < head >标签的上面并变形,例如
<head>
<s:head />
</head>
你可以把它放在任何地方,它只是输出 CSS 和 js 文件的路径(默认在 xhtml 主题中)。
<head>
</head>
<body>
<s:head />
...
Good Practice
为了提高网站的性能,最好的做法是将 CSS 文件放在页面的顶部;而 js 文件在页面底部。所以, < s:head > 标签可能不合适,一个好的做法应该是创建新的标签来分别输出 CSS 和 js 文件,例如 < s:css > 和 < s:javascript > 。
参考
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/20190222111847/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)
Struts 2 隐藏值示例
Download It – Struts2-Hidden-Example.zip
在 Struts 2 中,你可以使用 < s:hidden > 标签来创建一个 HTML 隐藏字段。
<s:hidden name="url" value="http://www.mkyong.com" />
它将呈现为以下 HTML 代码。
<input type="hidden" name="url" value="http://www.mkyong.com" />
Struts 2 示例
带有 url 隐藏值的页面,并在表单提交后显示隐藏值。
1.行动
HiddenAction.java
package com.mkyong.common.action;
import com.opensymphony.xwork2.ActionSupport;
public class HiddenAction extends ActionSupport{
private String url;
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String execute() {
return SUCCESS;
}
}
2.查看页面
Struts 2 " s:hidden "标记创建一个隐藏的值字段。
hidden.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 - hidden value example</h1>
<s:form action="helloHidden" namespace="/">
<h2>This page has a hidden value (view source):
<s:hidden name="url" value="http://www.mkyong.com" /></h2>
<s:submit value="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 - hidden value example</h1>
<h2>
The hidden value :
<s:property value="url"/>
</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="hidden">
<result>pages/hidden.jsp</result>
</action>
<action name="helloHidden" class="com.mkyong.common.action.HiddenAction">
<result name="success">pages/welcome.jsp</result>
</action>
</package>
</struts>
4.演示
http://localhost:8080/struts 2 example/hidden . action
参考
Struts 2 排序标签示例
原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-sort-tag-example/
Download It – Struts2-Sort-Tag-Example.zip
Struts 2 sort 标签用于使用 java.util.Comparator 对列表进行排序。在本教程中,您将创建 6 个 Person 对象并将所有对象添加到一个 ArrayList 中,并使用 sort 标签根据 Person 的属性对 ArrayList 进行排序。
To use this Struts 2 sort tag, you have to understand how java.util.Comparator work, please read this article – Java object sorting with Comparator.
1.人对象
创建一个具有“名字”、“姓氏”和“年龄”属性的 Person 对象。
Person.java
package com.mkyong.common;
public class Person{
private String firstName;
private String lastName;
private int age;
public Person(String firstName, String lastName, int age) {
super();
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
2.比较仪
创建 2 个比较器类,对人的“名字”和“年龄”属性进行排序。
FirstNameComparator.java
package com.mkyong.common;
import java.util.Comparator;
import com.mkyong.common.Person;
public class FirstNameComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
String firstName1 = p1.getFirstName().toUpperCase();
String firstName2 = p2.getFirstName().toUpperCase();
return firstName1.compareTo(firstName2);
}
}
AgeComparator.java
package com.mkyong.common;
import java.util.Comparator;
import com.mkyong.common.Person;
public class AgeComparator implements Comparator<Person> {
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}
3.行动
Action 类,初始化 6 个 Person 对象,并将其添加到一个 ArrayList 中。
package com.mkyong.common.action;
import java.util.ArrayList;
import java.util.List;
import com.mkyong.common.Person;
import com.opensymphony.xwork2.ActionSupport;
public class SortTagAction extends ActionSupport{
private List<Person> persons = new ArrayList<Person>();
public String execute() {
Person p1 = new Person("C-First", "C-Last", 40);
Person p2 = new Person("A-First", "A-Last", 20);
Person p3 = new Person("B-First", "B-Last", 10);
Person p4 = new Person("F-First", "F-Last", 33);
Person p5 = new Person("E-First", "E-Last", 22);
Person p6 = new Person("D-First", "D-Last", 11);
persons.add(p1);
persons.add(p2);
persons.add(p3);
persons.add(p4);
persons.add(p5);
persons.add(p6);
return SUCCESS;
}
public List<Person> getPersons() {
return persons;
}
public void setPersons(List<Person> persons) {
this.persons = persons;
}
}
4.排序标签示例
一个 JSP 页面,展示了如何使用 sort 标签对带有 FirstNameComparator 和 AgeComparator 的列表进行排序。
sort.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 Sort tag example</h1>
<s:bean name="com.mkyong.common.FirstNameComparator" var="firstNameComparator" />
<s:bean name="com.mkyong.common.AgeComparator" var="ageComparator" />
<table>
<tr>
<td>
1\. Display all persons (unsort).
<ol>
<s:iterator value="persons">
<li><s:property value="firstName" />,
<s:property value="lastName" />,
<s:property value="age" />
</li>
</s:iterator>
</ol>
</td>
<td>
2\. Display all persons (sort with firstName).
<s:sort comparator="#firstNameComparator" source="persons">
<ol>
<s:iterator>
<li><s:property value="firstName" />,
<s:property value="lastName" />,
<s:property value="age" />
</li>
</s:iterator>
</ol>
</s:sort>
</td>
</tr>
<tr>
<td colspan="2">
3\. Display all persons (sort with age).
<s:sort comparator="#ageComparator" source="persons">
<ol>
<s:iterator>
<li><s:property value="firstName" />,
<s:property value="lastName" />,
<s:property value="age" />
</li>
</s:iterator>
</ol>
</s:sort>
</td>
</tr>
</table>
</body>
</html>
5.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="sortTagAction"
class="com.mkyong.common.action.SortTagAction" >
<result name="success">pages/sort.jsp</result>
</action>
</package>
</struts>
4.演示
http://localhost:8080/struts 2 example/sorttagaction . action
输出
参考
Struts 2 密码示例
Download It – Struts2-Password-Example.zip
在 Struts 2 中,你可以使用 < s:password > 来创建一个 HTML 密码字段。例如,您可以用一个 key 属性或 label 和 name 属性声明“ s:password ”。
<s:password key="password" />
//or
<s:textfield label="Password" name="password" />
两者都生成相同的 HTML 输出(默认的 xhtml 主题)。
<td class="tdLabel">
<label for="registerUser_password" class="label">Password:</label>
</td>
<td>
<input type="password" name="password" id="registerUser_password"/>
</td>
Struts 2 示例
带有“密码”和“确认密码”字段的页面,并进行验证以确保“确认密码”与“密码”匹配。
1.属性文件
global.properties
#Global messages
username = Username
password = Password
confirmPassword = Confirm Password
submit = Submit
register action . properties
#error message
username.required = Username is required
password.required = Password is required
cpassword.required = Confirm password is required
cpassword.notmatch = Confirm password is not match
2.行动
RegisterAction.java
package com.mkyong.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport{
private String username;
private String password;
private String confirmPassword;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getConfirmPassword() {
return confirmPassword;
}
public void setConfirmPassword(String confirmPassword) {
this.confirmPassword = confirmPassword;
}
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"));
}
if("".equals(getPassword())){
addFieldError("password", getText("password.required"));
}
if("".equals(getConfirmPassword())){
addFieldError("confirmPassword", getText("cpassword.required"));
}
if(!(getPassword().equals(getConfirmPassword()))){
addFieldError("confirmPassword", getText("cpassword.notmatch"));
}
}
}
3.查看页面
使用 Struts 2 " s:password "标记创建 HTML 密码字段的结果页面。
register.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 - password example</h1>
<s:form action="registerUser" namespace="/user">
<s:textfield key="username" />
<s:password key="password" />
<s:password key="confirmPassword" />
<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 - password example</h1>
<h2>Password : <s:property value="password"/></h2>
<h2>Confirm Password : <s:property value="%{confirmPassword}"/></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 + Spring 3 + Quartz 1.8 调度器示例
在本教程中,我们将向您展示如何集成Struts 2+Spring 3+Quartz 1 . 8 . 6。
Why NOT Quartz 2?
Currently, Spring 3 is still NOT support Quartz 2 APIs, see this SPR-8581 bug report. Will update this article again once bug fixed is released.
使用的工具
- 弹簧 3.1.5 释放
- 石英
- 支柱 2.3.4
- 支柱 2-弹簧-插件 2.3.4
- maven3
- Eclipse 4.2
1.项目文件夹
这是最终的项目文件夹结构。
## 2.依赖库
集成与这个 Spring 2.5.6 + Quartz 1.6 类似,只是 Spring3 的依赖关系有点混乱,阅读下面的 Maven pom.xml 了解开发本教程所需的所有依赖关系。
查看 XML 注释可以理解为什么需要这个 jar。
文件:pom.xml
...
<dependencies>
<!-- Struts 2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.4</version>
</dependency>
<!-- Quartz framework -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.6</version>
</dependency>
<!-- Spring 3 dependencies -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<!-- QuartzJobBean in spring-context-support.jar -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<!-- Struts 2 + Spring 3 need this jar, ContextLoaderListener -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<!-- Spring + Quartz need transaction -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>3.1.2.RELEASE</version>
</dependency>
<!-- Struts 2 + Spring integration plugins -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.4</version>
</dependency>
</dependencies>
...
3.弹簧 3 +石英
要集成 Spring3 和 Quartz,需要创建一个扩展了org.springframework.scheduling.quartz.QuartzJobBean
的类,并实现executeInternal()
方法,就像在 Quartz 中创建调度作业一样。
文件: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
{
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Struts 2.3.4 + Quartz 1.8.6 + Spring 3.1.2");
}
}
File:application context . XML–将整个 Quartz 的调度程序和 Spring 细节放在applicationContext.xml
中。有关详细信息,请参见 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-3.0.xsd">
<!-- Spring Quartz Scheduler job -->
<bean name="schedulerJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.mkyong.quartz.SchedulerJob" />
</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>
<!-- DI -->
<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>
4.支柱 2 +弹簧 3
要集成 Struts 2 + Spring ,只需将org.springframework.web.context.ContextLoaderListener
监听器类放在web.xml
文件中。
Note
For detail, please read this Struts 2 + Spring integration example.
文件: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>
5.演示
完成,当 Strut2 启动时,它调用 Spring 并运行定义的 Quartz 的任务。
Jul 24, 2012 4:49:07 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-bio-8080"]
Jul 24, 2012 4:49:07 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-bio-8009"]
Jul 24, 2012 4:49:07 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in 3430 ms
Struts 2.3.4 + Quartz 1.8.6 + Spring 3.1.2 //run this every 10 seconds.
Struts 2.3.4 + Quartz 1.8.6 + Spring 3.1.2
Struts 2.3.4 + Quartz 1.8.6 + Spring 3.1.2
下载源代码
Download it – Struts2-Spring3-Quartz-Example.zip (20 KB).
参考
- Struts 2 + Spring 集成示例
- Struts 2 Spring 插件文档
- QuartzJobBean JavaDoc
- Spring 应支持石英 2.0 CronTrigger 接口
- 支柱 2 +弹簧 2.5.6 +石英集成示例
quartz scheduler spring3 struts2
Struts 2 + Spring + Hibernate 集成示例
Download it – Struts2-Spring-Hibernate-Integration-Example.zip
在本教程中,展示了“ Struts2 + Spring + Hibernate 之间的集成。在继续之前,请务必检查以下教程。
查看集成步骤摘要:
- 获取所有的依赖库(很多)。
- 注册弹簧的 ContextLoaderListener 以整合支柱 2 和弹簧。
- 使用 Spring 的 LocalSessionFactoryBean 来集成 Spring 和 Hibernate。
- 完成,全部连接。
查看关系:
Struts 2 <-- (ContextLoaderListener) --> Spring <-- (LocalSessionFactoryBean) --> Hibernate
This will be a very long tutorial with little explanation, make sure you check the above 3 articles for details explanation.
教程开始…
它将创建一个客户页面,添加客户和列出客户功能。前端使用 Struts 2 进行显示, Spring 作为依赖注入引擎, Hibernate 进行数据库操作。让我们开始…
1.项目结构
项目文件夹结构。
## 2.MySQL 表脚本
客户的表脚本。
DROP TABLE IF EXISTS `mkyong`.`customer`;
CREATE TABLE `mkyong`.`customer` (
`CUSTOMER_ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`NAME` varchar(45) NOT NULL,
`ADDRESS` varchar(255) NOT NULL,
`CREATED_DATE` datetime NOT NULL,
PRIMARY KEY (`CUSTOMER_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8;
3.依赖库
本教程需要许多依赖库。
支柱 2…
<!-- Struts 2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.8</version>
</dependency>
<!-- Struts 2 + Spring plugins -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.1.8</version>
</dependency>
MySQL…
<!-- MySQL database driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</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>
冬眠…
<!-- Hibernate core -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate</artifactId>
<version>3.2.7.ga</version>
</dependency>
<!-- Hibernate core library dependency start -->
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
<!-- Hibernate core library dependency end -->
<!-- Hibernate query library dependency start -->
<dependency>
<groupId>antlr</groupId>
<artifactId>antlr</artifactId>
<version>2.7.7</version>
</dependency>
<!-- Hibernate query library dependency end -->
4.冬眠…
只需要模型和映射文件,因为 Spring 将处理 Hibernate 配置。
Customer.java–为客户表创建一个类。
package com.mkyong.customer.model;
import java.util.Date;
public class Customer implements java.io.Serializable {
private Long customerId;
private String name;
private String address;
private Date createdDate;
//getter and setter methods
}
customer . hbm . XML–客户的 Hibernate 映射文件。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 20 Julai 2010 11:40:18 AM by Hibernate Tools 3.2.5.Beta -->
<hibernate-mapping>
<class name="com.mkyong.customer.model.Customer"
table="customer" catalog="mkyong">
<id name="customerId" type="java.lang.Long">
<column name="CUSTOMER_ID" />
<generator class="identity" />
</id>
<property name="name" type="string">
<column name="NAME" length="45" not-null="true" />
</property>
<property name="address" type="string">
<column name="ADDRESS" not-null="true" />
</property>
<property name="createdDate" type="timestamp">
<column name="CREATED_DATE" length="19" not-null="true" />
</property>
</class>
</hibernate-mapping>
5.Struts 2…
实现 Bo 和 DAO 设计模式。Spring 将在 Spring bean 配置文件中 DI 所有的 Bo 和 DAO。在 DAO 中,make 它扩展 Spring 的 HibernateDaoSupport 来集成 Spring 和 Hibernate 的集成。
CustomerBo.java
package com.mkyong.customer.bo;
import java.util.List;
import com.mkyong.customer.model.Customer;
public interface CustomerBo{
void addCustomer(Customer customer);
List<Customer> listCustomer();
}
CustomerBoImpl.java
package com.mkyong.customer.bo.impl;
import java.util.List;
import com.mkyong.customer.bo.CustomerBo;
import com.mkyong.customer.dao.CustomerDAO;
import com.mkyong.customer.model.Customer;
public class CustomerBoImpl implements CustomerBo{
CustomerDAO customerDAO;
//DI via Spring
public void setCustomerDAO(CustomerDAO customerDAO) {
this.customerDAO = customerDAO;
}
//call DAO to save customer
public void addCustomer(Customer customer){
customerDAO.addCustomer(customer);
}
//call DAO to return customers
public List<Customer> listCustomer(){
return customerDAO.listCustomer();
}
}
CustomerDAO.java
package com.mkyong.customer.dao;
import java.util.List;
import com.mkyong.customer.model.Customer;
public interface CustomerDAO{
void addCustomer(Customer customer);
List<Customer> listCustomer();
}
CustomerDAOImpl.java
package com.mkyong.customer.dao.impl;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.mkyong.customer.dao.CustomerDAO;
import com.mkyong.customer.model.Customer;
public class CustomerDAOImpl extends HibernateDaoSupport
implements CustomerDAO{
//add the customer
public void addCustomer(Customer customer){
getHibernateTemplate().save(customer);
}
//return all the customers in list
public List<Customer> listCustomer(){
return getHibernateTemplate().find("from Customer");
}
}
CustomerAction.java–支柱 2 动作不再需要伸出动作支架,弹簧会处理它。
package com.mkyong.customer.action;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import com.mkyong.customer.bo.CustomerBo;
import com.mkyong.customer.model.Customer;
import com.opensymphony.xwork2.ModelDriven;
public class CustomerAction implements ModelDriven{
Customer customer = new Customer();
List<Customer> customerList = new ArrayList<Customer>();
CustomerBo customerBo;
//DI via Spring
public void setCustomerBo(CustomerBo customerBo) {
this.customerBo = customerBo;
}
public Object getModel() {
return customer;
}
public List<Customer> getCustomerList() {
return customerList;
}
public void setCustomerList(List<Customer> customerList) {
this.customerList = customerList;
}
//save customer
public String addCustomer() throws Exception{
//save it
customer.setCreatedDate(new Date());
customerBo.addCustomer(customer);
//reload the customer list
customerList = null;
customerList = customerBo.listCustomer();
return "success";
}
//list all customers
public String listCustomer() throws Exception{
customerList = customerBo.listCustomer();
return "success";
}
}
6.春天…
几乎所有的配置都是在这里完成的,毕竟 Spring 是专门做集成工作的:)。
customer bean . XML–声明春天的豆子:Action、BO、DAO。
<?xml version="1.0" encoding="UTF-8"?>
<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">
<bean id="customerAction" class="com.mkyong.customer.action.CustomerAction">
<property name="customerBo" ref="customerBo" />
</bean>
<bean id="customerBo" class="com.mkyong.customer.bo.impl.CustomerBoImpl" >
<property name="customerDAO" ref="customerDAO" />
</bean>
<bean id="customerDAO" class="com.mkyong.customer.dao.impl.CustomerDAOImpl" >
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
database . properties–声明数据库细节。
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mkyong
jdbc.username=root
jdbc.password=password
data source . XML–创建一个数据源 bean。
<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">
<bean
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>WEB-INF/classes/config/database/properties/database.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
</beans>
hibernatesessionfactory . XML–创建一个 sessionFactory bean 来集成 Spring 和 Hibernate。
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!-- Hibernate session factory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"/>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/mkyong/customer/hibernate/Customer.hbm.xml</value>
</list>
</property>
</bean>
</beans>
Spring beans . XML–创建一个核心 Spring 的 bean 配置文件,作为中心 bean 管理。
<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">
<!-- Database Configuration -->
<import resource="config/spring/DataSource.xml"/>
<import resource="config/spring/HibernateSessionFactory.xml"/>
<!-- Beans Declaration -->
<import resource="com/mkyong/customer/spring/CustomerBean.xml"/>
</beans>
7.JSP 页面
显示带有 Struts 2 标记的元素的 JSP 页面。
customer.jsp
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>
<body>
<h1>Struts 2 + Spring + Hibernate integration example</h1>
<h2>Add Customer</h2>
<s:form action="addCustomerAction" >
<s:textfield name="name" label="Name" value="" />
<s:textarea name="address" label="Address" value="" cols="50" rows="5" />
<s:submit />
</s:form>
<h2>All Customers</h2>
<s:if test="customerList.size() > 0">
<table border="1px" cellpadding="8px">
<tr>
<th>Customer Id</th>
<th>Name</th>
<th>Address</th>
<th>Created Date</th>
</tr>
<s:iterator value="customerList" status="userStatus">
<tr>
<td><s:property value="customerId" /></td>
<td><s:property value="name" /></td>
<td><s:property value="address" /></td>
<td><s:date name="createdDate" format="dd/MM/yyyy" /></td>
</tr>
</s:iterator>
</table>
</s:if>
<br/>
<br/>
</body>
</html>
8.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="addCustomerAction"
class="customerAction" method="addCustomer" >
<result name="success">pages/customer.jsp</result>
</action>
<action name="listCustomerAction"
class="customerAction" method="listCustomer" >
<result name="success">pages/customer.jsp</result>
</action>
</package>
</struts>
9.支柱 2 +弹簧
要集成 Struts 2 和 Spring,只需注册 ContextLoaderListener 监听器类,定义一个“ contextConfigLocation 参数,让 Spring container 解析“ SpringBeans.xml ”而不是默认的“ applicationContext.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>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/SpringBeans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
</web-app>
10.演示
测试一下:http://localhost:8080/struts 2 example/listcustomeraction . action
参考
- Struts 2 + Hibernate 集成示例
- Struts 2 + Spring 集成示例
- 带有完整 Hibernate 插件的 Struts 2 + Hibernate 示例
- Struts 1.x + Spring + Hibernate 集成示例
hibernate integration spring struts2
Struts 2 + Spring 集成示例
Download it – Struts2-Spring-Integration-Example.zip
在本教程中,它展示了 Struts 2 和 Spring 之间的集成。
1.项目结构
这是本教程的项目文件夹结构。
2.Struts 2 + Spring 插件
要集成 Struts 2 和 Spring,获取并在项目类路径中包含"Struts 2-Spring-plugin-XXX . jar"库。
pom.xml
<!-- Struts 2 -->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.1.8</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>
3.春天的听众
在 web.xml 文件中配置 Spring 监听器"org . Spring framework . web . context . context loader listener"。
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>
3.注册春豆
在 applicationContext.xml 文件中注册所有 Spring 的 Beans,Spring 监听器将自动定位这个 xml 文件。
applicationContext.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">
<bean id="userBo" class="com.mkyong.user.bo.impl.UserBoImpl" />
<bean id="userSpringAction" class="com.mkyong.user.action.UserSpringAction">
<property name="userBo" ref="userBo" />
</bean>
</beans>
UserBo.java
package com.mkyong.user.bo;
public interface UserBo{
public void printUser();
}
UserBoImpl.java
package com.mkyong.user.bo.impl;
import com.mkyong.user.bo.UserBo;
public class UserBoImpl implements UserBo{
public void printUser(){
System.out.println("printUser() is executed...");
}
}
user springaction . Java
package com.mkyong.user.action;
import com.mkyong.user.bo.UserBo;
public class UserSpringAction{
//DI via Spring
UserBo userBo;
public UserBo getUserBo() {
return userBo;
}
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
public String execute() throws Exception {
userBo.printUser();
return "success";
}
}
5.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="userAction"
class="com.mkyong.user.action.UserAction" >
<result name="success">pages/user.jsp</result>
</action>
<action name="userSpringAction"
class="userSpringAction" >
<result name="success">pages/user.jsp</result>
</action>
</package>
</struts>
6.演示
现在,所有 Struts 2 和 Spring 的集成工作都完成了,现在看下面的用例来访问 Spring 的"userBobean。
- 案例 1:让 Spring 充当 Struts 2 操作类,并访问 Spring 的 bean。
- 案例 2:在 Struts 2 操作类中访问 Spring 的 bean。
案例 1
在这个例子中,userpspringaction作为 Struts 2 的 Action 类,你可以用普通的 Spring 方式来定义 Spring 的 userBo bean。
//struts.xml
<action name="userSpringAction"
class="userSpringAction" >
<result name="success">pages/user.jsp</result>
</action>
//applicationContext.xml
<bean id="userSpringAction" class="com.mkyong.user.action.UserSpringAction">
<property name="userBo" ref="userBo" />
</bean>
要访问此操作,请使用以下 URL:http://localhost:8080/struts 2 example/userpspringaction
案例 2
默认情况下,Spring listener 通过匹配 bean 名称来启用自动连接。因此,它会通过 setUserBo() 自动将 Spring 的“userBo”bean 传递给 UserAction。见下面 Struts 2 的动作:
The Spring’s autowiring feature can change to name(default), type, auto or constructor, you may need to consult this Struts 2 Spring plugin documentation.
user action . Java
package com.mkyong.user.action;
import com.mkyong.user.bo.UserBo;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
//DI via Spring
UserBo userBo;
public UserBo getUserBo() {
return userBo;
}
public void setUserBo(UserBo userBo) {
this.userBo = userBo;
}
public String execute() throws Exception {
userBo.printUser();
return SUCCESS;
}
}
要访问此操作,请使用 URL:http://localhost:8080/struts 2 example/user action
WebApplicationContextUtils
Alternatively, you can use the Spring’s generic WebApplicationContextUtils class to get the Spring’s bean directly.
package com.mkyong.user.action;
import org.apache.struts2.ServletActionContext;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.mkyong.user.bo.UserBo;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
public String execute() throws Exception {
WebApplicationContext context =
WebApplicationContextUtils.getRequiredWebApplicationContext(
ServletActionContext.getServletContext()
);
UserBo userBo1 = (UserBo)context.getBean("userBo");
userBo1.printUser();
return SUCCESS;
}
}
一篇非常冗长乏味的文章,请确保下载完整的项目源代码进行练习。