Mkyong 中文博客翻译(六十六)

原文:Mkyong

协议:CC BY-NC-SA 4.0

Struts 2 文件上传示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-file-upload-example/

Download It – Struts2-File-Upload-Example.zip

在 Struts 2 中, < s:file > 标签用于创建一个 HTML 文件上传组件,允许用户从本地磁盘选择文件并上传到服务器。在本教程中,您将创建一个带有文件上传组件的 JSP 页面,设置上传文件的最大大小和允许的内容类型,并显示上传文件的详细信息。

1.动作类

Action 类用于文件上传,声明一个“file”变量来存储用户上传的文件,两个 String 变量来存储文件名和内容类型。“ fileUpload 拦截器”将通过 set“X”content type()和 set“X”FileName()自动注入上传的文件细节,确保方法名拼写正确。

P.S X 是存储上传文件的变量。

The file upload function is depends on the “fileUpload Interceptor“, make sure it is included in the Action’s stack. The lucky is, the default stack is already includes the “fileUpload Interceptor“.

FileUploadAction.java

 package com.mkyong.common.action;

import java.io.File;

import com.opensymphony.xwork2.ActionSupport;

public class FileUploadAction extends ActionSupport{
    
    

	private File fileUpload;
	private String fileUploadContentType;
	private String fileUploadFileName;

	public String getFileUploadContentType() {
    
    
		return fileUploadContentType;
	}

	public void setFileUploadContentType(String fileUploadContentType) {
    
    
		this.fileUploadContentType = fileUploadContentType;
	}

	public String getFileUploadFileName() {
    
    
		return fileUploadFileName;
	}

	public void setFileUploadFileName(String fileUploadFileName) {
    
    
		this.fileUploadFileName = fileUploadFileName;
	}

	public File getFileUpload() {
    
    
		return fileUpload;
	}

	public void setFileUpload(File fileUpload) {
    
    
		this.fileUpload = fileUpload;
	}

	public String execute() throws Exception{
    
    

		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 <s:file> file upload example</h1>

<s:form action="resultAction" namespace="/" 
method="POST" enctype="multipart/form-data">

<s:file name="fileUpload" label="Select a File to upload" 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 <s:file> file upload 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" />
 	<constant name="struts.custom.i18n.resources" value="global" />

	<package name="default" namespace="/" extends="struts-default">

	<action name="fileUploadAction" 
	    class="com.mkyong.common.action.FileUploadAction" method="display">
	    <result name="none">pages/fileupload.jsp</result>
	</action>

	<action name="resultAction" class="com.mkyong.common.action.FileUploadAction">
	    <interceptor-ref name="exception"/>
            <interceptor-ref name="i18n"/>
            <interceptor-ref name="fileUpload">
       		<param name="allowedTypes">text/plain</param>
       		<param name="maximumSize">10240</param>
  	    </interceptor-ref> 
            <interceptor-ref name="params">
                <param name="excludeParams">dojo\..*,^struts\..*</param>
            </interceptor-ref>
            <interceptor-ref name="validation">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>
            <interceptor-ref name="workflow">
                <param name="excludeMethods">input,back,cancel,browse</param>
            </interceptor-ref>

	    <result name="success">pages/result.jsp</result>
	    <result name="input">pages/fileupload.jsp</result>

	</action>
   </package>	
</struts> 

文件大小限制
在本例中,您通过“ fileUpload interceptor 设置上传文件大小限制,该值以字节为单位计数。在这种情况下,上传文件的最大大小为 10kb。

The default maximum file size of the upload file is 2MB

文件类型
您也可以通过文件上传拦截器设置允许的文件类型。在这种情况下,上传文件只接受" text/plain 内容类型。

In Struts 2, there are may ways to lead same Rome, make sure you check this Struts 2 file upload documentation.

4.演示

http://localhost:8080/struts 2 example/file upload action . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果您上传的文件大于 10kb,或者不是文本文件,则会出现错误消息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上传一个名为“XWORK-LICENSE.txt”的文本文件,文件大小:5kb。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上传的文件将被视为临时文件,具有长的随机文件名,upload _ _ 376584 a7 _ 12981122379 _ _ 8000 _ 0000010 . tmp。请确保将此临时文件复制到其他地方。阅读 FileUtils 文档轻松复制文件。

参考

  1. Struts 2 文件文档
  2. http://struts.apache.org/2.0.14/docs/file-upload.html
  3. http://struts . Apache . org/2 . 0 . 14/docs/how-do-we-upload-files . html
  4. http://commons . Apache . org/io/API-1.4/org/Apache/commons/io/fileutils . html
  5. 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/20190210101631/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-generator-tag-example/

Download It – Struts2-Generator-Tag-Example.zip

Struts 2 生成器标签用于根据页面中提供的“ val 属性生成一个迭代器。在本教程中,您将使用 Struts 2 生成器标签来完成以下任务:

  1. 用生成器标签创建一个迭代器。
  2. 创建一个带有生成器标签的迭代器,并用“转换器对象修改迭代器值。

1.行动

一个操作类,其方法返回一个“转换器对象。

生成或动作

 package com.mkyong.common.action;

import org.apache.struts2.util.IteratorGenerator.Converter;
import com.opensymphony.xwork2.ActionSupport;

public class GeneratorTagAction extends ActionSupport{
    
    

	public String execute() {
    
    

		return SUCCESS;
	}

	public Converter getLanguageConverter(){
    
    
		return new Converter() {
    
    
	         public Object convert(String value) throws Exception {
    
    

	        	 if("java".equals(value)){
    
    
	        		 return "[java value in converter] - " + value;
	        	 }else{
    
    
	        		 return value;
	        	 }

	         }
	     };
	}
} 

2.生成器标签示例

一个 JSP 页面,展示了如何使用生成器标签来动态创建迭代器。“分隔符属性是必需的,它将 val 分隔成迭代器的条目。

转换器属性是可选的,允许您修改该值。在这种情况下,它将调用 GeneratorTagAction 的 getLanguageConverter() 方法,如果值等于“java”字符串,则修改该值。

generator.jsp

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

<body>
<h1>Struts 2 Generator tag example</h1>

1\. Generator tag example.
<s:generator val="%{'java|.net|c|python|shell'}" separator="|">
<ol>
<s:iterator>
  <li><s:property /></li>
</s:iterator>
</s:generator>
</ol>  

2\. Generator tag with converter example
<s:generator val="%{'java|.net|c|python|shell'}" separator="|" 
converter="%{languageConverter}">
<ol>
<s:iterator>
  <li><s:property /></li>
</s:iterator>
</s:generator>
</ol>  

</body>
</html> 

Can’t find any use case of this generator tag, as i don’t recommend to hardcore the iterator values in the page. ## 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="appendTagAction" 
			class="com.mkyong.common.action.AppendTagAction" >
			<result name="success">pages/appendIterator.jsp</result>
		</action>

	</package>

</struts> 

4.演示

http://localhost:8080/struts 2 example/generatortagaction . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. Struts 2 生成器文档
  2. Struts 2 转换器文档

struts2

Struts 2 Hello World 注释示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-hello-world-annotation-example/

在本教程中,它将重用之前的 Strust 2 Hello World (XML 版本)示例,并将其转换为注释版本。

Download It – Struts2-Hello-World-Annotation-Example.zip

Struts 2 注释概念

Struts 2 注释是由 Struts 2 约定插件支持的,因此,您必须理解其“扫描方法学”和“命名转换器”机制背后的魔力。

1.扫描方法

许多 Struts 2 的文章或书籍指出,您可以配置过滤器的" init-param 或"Struts . conventi on . action . packages"来告诉 Struts 2 在哪里扫描带注释的类。举个例子,

web.xml

 <filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  <init-param>
	<param-name>actionPackages</param-name>
	<param-value>com.mkyong.common</param-value>
  </init-param>
</filter> 

从我的测试(Struts2 版本 2.1.6 和 2.1.8)来看,这是不正确的,无论你在" param-value 或"Struts . conventi on . action . packages中放什么,struts2 都会忽略它,只扫描指定的名为 struts、Struts 2、action 或 actions 的文件夹。

这是扫描的工作原理

  1. 扫描位于名为“ struts,struts2,action 或 actions ”的包中的注释类。
  2. 接下来,扫描符合以下任一标准的文件:
    • 实现了com . open symphony . xwork 2 . action接口。
    • 扩展com . open symphony . xwork 2 . action support类。
    • 文件名以动作结尾(如用户动作、登录动作)。

参见这个 Struts 2 约定插件文档

2.命名转换器

Struts 2 约定插件将把所有带注释的动作文件名转换成指定的格式。

比如:LoginAction.java

  1. 首先,删除文件名末尾的“操作”一词(如果有)。
  2. 其次,将文件名的第一个字母转换成小写。

因此,在删除结尾并转换第一个字母的大小写后, LoginAction.action 将变为 login.action

The Struts 2 convention plugin’s “scanning methodology” and “naming converter” features are really bring a lot of conveniences and benefits, only if your Struts 2 project is following the naming convention properly; otherwise it will be a total disaster.

Struts 2 注释示例

是时候开始转换过程了。

最终项目结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

1.更新 pom.xml

要使用 Struts 2 注释特性,您需要下载Struts 2-conventi on-plugin . jar
POM . XML

 ...
    <dependency>
          <groupId>org.apache.struts</groupId>
	  <artifactId>struts2-core</artifactId>
	  <version>2.1.8</version>
    </dependency>

    <dependency>
          <groupId>org.apache.struts</groupId>
	  <artifactId>struts2-convention-plugin</artifactId>
	  <version>2.1.8</version>
    </dependency>
... 

2.登录操作

创建一个 LoginAction 扩展 ActionSupport 并且什么都不做, ActionSupport 默认返回一个“success”字符串,它将匹配@Result 并重定向到“ pages/login.jsp ”。

注释版本

 package com.mkyong.user.action;

import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/User")
@ResultPath(value="/")
@Result(name="success",location="pages/login.jsp")
public class LoginAction extends ActionSupport{
    
    

} 

XML 等效物

 <package name="user" namespace="/User" extends="struts-default">
	<action name="Login">
		<result>pages/login.jsp</result>
	</action>
</package> 

3.WelcomeUserAction

重写 execute()方法并指定@Action 和@Result 批注。

注释版本

 package com.mkyong.user.action;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;

import com.opensymphony.xwork2.ActionSupport;

@Namespace("/User")
@ResultPath(value="/")
public class WelcomeUserAction extends ActionSupport{
    
    

	private String username;

	public String getUsername() {
    
    
		return username;
	}

	public void setUsername(String username) {
    
    
		this.username = username;
	}

	@Action(value="Welcome", results={
    
    
		@Result(name="success",location="pages/welcome_user.jsp")
	})
	public String execute() {
    
    

		return SUCCESS;

	}
} 

XML 等效物

 <package name="user" namespace="/User" extends="struts-default">
   <action name="Welcome" class="com.mkyong.user.action.WelcomeUserAction">
	<result name="SUCCESS">pages/welcome_user.jsp</result>
   </action>
</package> 

The Struts 2 annotations – @Action, @Result and @Namespace are self-explanatory, you can always compare it with the XML equivalent. The @ResultPath may need a bit explanation, see this @ResultPath example.

4.JSP 视图页面

普通 JSP 视图页面接受用户名和密码,并在单击提交按钮后重定向到欢迎页面。

login.jsp

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

Struts 2 Hello World 注释示例

**welcome_user.jsp**
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

Struts 2 Hello World 注释示例

你好

5.struts.xml

不需要创建 struts.xml 文件,所有类都有注释。

6.web.xml

只需创建一个经典的 web.xml 文件,并将 FilterDispatcher 过滤器声明为普通过滤器。

 <!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.FilterDispatcher</filter-class>
  </filter>

  <filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app> 

7.运行它

登录动作改为登录动作,参见上面的“命名转换器”。
http://localhost:8080/struts 2 example/User/log in . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://localhost:8080/struts 2 example/User/welcome . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. Struts 2 约定插件文档
  2. Strust 2 Hello World (XML 版)

annotation hello world struts2

Struts 2 Hello World 示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-hello-world-example/

在这个例子中,我们向您展示了如何在 Struts 2 中创建一个 hello world 示例。

使用了以下库或工具:

  • maven3
  • Eclipse 3.7
  • struts 2.3.1.2

1.最终项目结构

让我们回顾一下本教程的最终项目结构,以防您在后面的步骤中迷路。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传freestar.config.enabled_slots.push({ placementName: “mkyong_incontent_1”, slotId: “mkyong_incontent_1” });

2.Struts2 依赖关系

使用 Maven 下载整个 Struts2 依赖项。在pom.xml中增加struts2-core

文件:pom.xml

 <project  
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
        http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.mkyong.common</groupId>
	<artifactId>Struts2Example</artifactId>
	<packaging>war</packaging>
	<version>com.mkyong.common</version>
	<name>Struts2Example Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.3.1.2</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>Struts2Example</finalName>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>2.3.2</version>
				<configuration>
					<source>1.6</source>
					<target>1.6</target>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project> 

3.转换为 Eclipse 项目

在命令提示符下编译并转换为 Eclipse web 项目:

 mvn eclipse:eclipse -Dwtpversion=2.0 

回顾日食。类路径文件中,将下载以下 Struts2 依赖项:

文件:。类路径

 <classpath>
  <classpathentry kind="src" path="src/main/java" including="**/*.java"/>
  <classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
  <classpathentry kind="output" path="target/classes"/>
  <classpathentry kind="var" path="M2_REPO/asm/asm/3.3/asm-3.3.jar"/>
  <classpathentry kind="var" path="M2_REPO/asm/asm-commons/3.3/asm-commons-3.3.jar"/>
  <classpathentry kind="var" path="M2_REPO/asm/asm-tree/3.3/asm-tree-3.3.jar"/>
  <classpathentry kind="var" path="M2_REPO/commons-fileupload/commons-fileupload/1.2.2/commons-fileupload-1.2.2.jar" />
  <classpathentry kind="var" path="M2_REPO/commons-io/commons-io/2.0.1/commons-io-2.0.1.jar"/>
  <classpathentry kind="var" path="M2_REPO/commons-lang/commons-lang/2.5/commons-lang-2.5.jar"/>
  <classpathentry kind="var" path="M2_REPO/org/freemarker/freemarker/2.3.18/freemarker-2.3.18.jar"/>
  <classpathentry kind="var" path="M2_REPO/javassist/javassist/3.11.0.GA/javassist-3.11.0.GA.jar"/>
  <classpathentry kind="var" path="M2_REPO/junit/junit/3.8.1/junit-3.8.1.jar"/>
  <classpathentry kind="var" path="M2_REPO/ognl/ognl/3.0.4/ognl-3.0.4.jar"/>
  <classpathentry kind="var" path="M2_REPO/org/apache/struts/struts2-core/2.3.1.2/struts2-core-2.3.1.2.jar"/>
  <classpathentry kind="lib" path="C:/Program Files/Java/jdk1.6.0_13/lib/tools.jar"/>
  <classpathentry kind="var" path="M2_REPO/org/apache/struts/xwork/xwork-core/2.3.1.2/xwork-core-2.3.1.2.jar"/>
  <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
</classpath> 

4.JSP 视图页面

一个 JSP 登录页面,使用 Struts 2 标记来显示用户名和密码输入字段以及提交按钮。

login.jsp

 <%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head></head>
<body>
	<h1>Struts 2 Hello World Example</h1>

	<s:form action="Welcome">
		<s:textfield name="username" label="Username" />
		<s:password name="password" label="Password" />
		<s:submit />
	</s:form>

</body>
</html> 

File:welcome _ user . jsp–向用户显示欢迎消息的 JSP 视图页面。

 <%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head></head>
<body>
	<h1>Struts 2 Hello World Example</h1>

	<h2>
		Hello
		<s:property value="username" />
	</h2>

</body>
</html> 

Struts 1 和 Struts 2 具有非常相似的 UI 标记语法,只是在命名 HTML 元素方面有一点不同,例如:

支柱 1

 <%@taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html:form action="Welcome">
   <html:text property="username"/>
</html:form> 

支柱 2

 <%@ taglib prefix="s" uri="/struts-tags" %>
<s:form action="Welcome">
	<s:textfield name="username" label="Username"/>
</s:form> 

5.动作,把所有的业务逻辑放在这里

一个简单的 Struts2 Action 类,它用来声明里面所有的业务逻辑。

文件:WelcomeUserAction.java

 package com.mkyong.user.action;

public class WelcomeUserAction{
    
    

	private String username;

	public String getUsername() {
    
    
		return username;
	}

	public void setUsername(String username) {
    
    
		this.username = username;
	}

	// all struts logic here
	public String execute() {
    
    

		return "SUCCESS";

	}
} 

在 Struts2 中,Action 类不需要实现任何接口或扩展任何类,但需要创建一个execute()方法来将所有业务逻辑放入其中,并返回一个字符串值来告诉用户重定向到哪里。

Note
You may see some users implement the com.opensymphony.xwork2.Action class, but it’s totally optional, because the com.opensymphony.xwork2.Action is just provide some handy constant values only.Note
Struts1’s Action class is required to extends the org.apache.struts.action.Action. But Struts 2 Action class is optional, but you are still allow to implement the com.opensymphony.xwork2.Action for some handy constant values or extends the com.opensymphony.xwork2.ActionSupport for some common default Action implementation functions.

5.Struts 配置文件

一个 Strut 配置文件将所有的东西链接在一起。XML 文件名必须是“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>

	<package name="user" namespace="/User" extends="struts-default">
		<action name="Login">
			<result>pages/login.jsp</result>
		</action>
		<action name="Welcome" class="com.mkyong.user.action.WelcomeUserAction">
			<result name="SUCCESS">pages/welcome_user.jsp</result>
		</action>
	</package>

</struts> 

声明一个包,并将动作类放入其中,动作类是自解释的,但是您可能会对下面的新标签感兴趣:

**1。**package name = " user "
只是一个包名,不用太在意。

2。namespace=“/User”
用于匹配"/User" URL 模式。参见本文—Struts 2 名称空间示例和解释

Note
Actually, the Struts2 Namespaces is equivalent to Struts 1 multiple modules

3。extends = " struts-default "
这意味着该包扩展了 struts-default 包的组件和拦截器,这在位于 struts2-core.jar 文件根目录下的 struts-default.xml 文件中声明。

6.web.xml

配置 web 应用程序部署描述符(web.xml)文件,将 Struts2 集成到您的 Web 项目中。

文件 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>

</web-app> 

7.运行它

在 Struts2 中,可以用后缀直接访问 action 类。动作

http://localhost:8080/struts 2 example/User/log in . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://localhost:8080/struts 2 example/User/welcome . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载它

Download it – Struts2-Hello-World-Example.zip (7 KB)Tags : hello world struts2freestar.config.enabled_slots.push({ placementName: “mkyong_leaderboard_btf”, slotId: “mkyong_leaderboard_btf” });

Struts 2 + Hibernate 集成示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-hibernate-integration-example/

Download it – Struts2-Hibernate-Integration-Example.zip

在 Struts2 中,没有集成 Hibernate 框架的官方插件。但是,您可以通过以下步骤解决这个问题:

  1. 注册一个自定义的 ServletContextListener
  2. ServletContextListener 类中,初始化 Hibernate 会话,并将其存储到 servlet 上下文中。
  3. 在 action 类中,从 servlet 上下文中获取 Hibernate 会话,并正常执行 Hibernate 任务。

查看关系:

 Struts 2 <-- (Servlet Context) ---> Hibernate <-----> Database 

在本教程中,展示了一个简单的客户模块(添加和列表功能),用 Struts 2 开发,用 Hibernate 执行数据库操作。集成部分使用上述机制(在 servlet 上下文中存储和检索 Hibernate 会话)。

This workaround is very similar with the classic Struts 1.x and Hibernate integration, just the classic Struts 1.x is using the Struts’s plugins; While the Struts 2 is using the generic servlet listener.

1.项目结构

查看完整的项目文件夹结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 ## 2.MySQL 表脚本

为演示创建一个客户表。下面是 SQL 表脚本。

 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.属国

获取 Struts2、Hibernate 和 MySQL 依赖库。

 //...
	<!-- Struts 2 -->
	<dependency>
	        <groupId>org.apache.struts</groupId>
		<artifactId>struts2-core</artifactId>
		<version>2.1.8</version>
        </dependency>

	<!-- MySQL database driver -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.9</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.冬眠的东西

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">
<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> 

Hibernate . CFG . XML–Hibernate 数据库配置文件。

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="use_sql_comments">false</property>
    <mapping resource="com/mkyong/customer/hibernate/Customer.hbm.xml" />
  </session-factory>
</hibernate-configuration> 

5.hibernate 上下文侦听器

创建一个 ServletContextListener ,初始化 Hibernate 会话,并将其存储到 servlet context 中。

冬眠监听器。java

 package com.mkyong.listener;

import java.net.URL;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateListener implements ServletContextListener{
    
    

    private Configuration config;
    private SessionFactory factory;
    private String path = "/hibernate.cfg.xml";
    private static Class clazz = HibernateListener.class;

    public static final String KEY_NAME = clazz.getName();

	public void contextDestroyed(ServletContextEvent event) {
    
    
	  //
	}

	public void contextInitialized(ServletContextEvent event) {
    
    

	 try {
    
     
	        URL url = HibernateListener.class.getResource(path);
	        config = new Configuration().configure(url);
	        factory = config.buildSessionFactory();

	        //save the Hibernate session factory into serlvet context
	        event.getServletContext().setAttribute(KEY_NAME, factory);
	  } catch (Exception e) {
    
    
	         System.out.println(e.getMessage());
	   }
	}
} 

在 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>
	  com.mkyong.listener.HibernateListener
    </listener-class>
  </listener>

</web-app> 

6.行动

在 Action 类中,从 servlet 上下文中获取 Hibernate 会话,并正常执行 Hibernate 任务。

CustomerAction.java

 package com.mkyong.customer.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.struts2.ServletActionContext;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import com.mkyong.customer.model.Customer;
import com.mkyong.listener.HibernateListener;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class CustomerAction extends ActionSupport 
	implements ModelDriven{
    
    

	Customer customer = new Customer();
	List<Customer> customerList = new ArrayList<Customer>();

	public String execute() throws Exception {
    
    
		return SUCCESS;
	}

	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{
    
    

		//get hibernate session from the servlet context
		SessionFactory sessionFactory = 
	         (SessionFactory) ServletActionContext.getServletContext()
                     .getAttribute(HibernateListener.KEY_NAME);

		Session session = sessionFactory.openSession();

		//save it
		customer.setCreatedDate(new Date());

		session.beginTransaction();
		session.save(customer);
		session.getTransaction().commit();

		//reload the customer list
		customerList = null;
		customerList = session.createQuery("from Customer").list();

		return SUCCESS;

	}

	//list all customers
	public String listCustomer() throws Exception{
    
    

		//get hibernate session from the servlet context
		SessionFactory sessionFactory = 
	         (SessionFactory) ServletActionContext.getServletContext()
                     .getAttribute(HibernateListener.KEY_NAME);

		Session session = sessionFactory.openSession();

		customerList = session.createQuery("from Customer").list();

		return SUCCESS;

	}	
} 

7.JSP 页面

添加和列出客户的 JSP 页面。

customer.jsp

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

<body>
<h1>Struts 2 + 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="com.mkyong.customer.action.CustomerAction" method="addCustomer" >
       <result name="success">pages/customer.jsp</result>
    </action>

    <action name="listCustomerAction" 
	class="com.mkyong.customer.action.CustomerAction" method="listCustomer" >
        <result name="success">pages/customer.jsp</result>
    </action>		

  </package>	
</struts> 

9.演示

访问客户模块:http://localhost:8080/struts 2 example/listcustomeraction . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

填写姓名和地址字段,点击提交按钮,插入的客户详细信息将立即列出。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. Struts 2 + Hibernate 与“全 Hibernate 插件”的集成
  2. ServletContextListener 文档
  3. Struts + Hibernate 集成示例

hibernate integration struts2

Struts 2 + Hibernate 与“完全 Hibernate 插件”的集成

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-hibernate-integration-with-full-hibernate-plugin/

在最后一个 Struts 2 + Hibernate 集成的例子中,它使用 servlet 上下文监听器来处理 Hibernate 会话,并且很好地将 Struts 2 与 Hibernate 框架集成在一起。

但是,总有需要改进的地方:)在本教程中,我们将向您展示如何通过使用由 jyoshiriro 创建的名为“ Full Hibernate Plugin ”的 2.2GA 版本的 Struts2 插件来集成 Struts2 和 Hibernate。

查看集成步骤摘要:

  1. 将“ Full Hibernate 插件jar”放在项目类路径中。
  2. 使用批注" @SessionTarget "注入 Hibernate 会话;而“ @TransactionTarget ”则注入 Hibernate 事务。
  3. struts.xml 中,使包扩展“ hibernate-default ”,而不是默认栈。

查看关系:

 Struts 2 <-- (Full Hibernate Plugin) ---> Hibernate <-----> Database 

Note
This tutorial is an update version from the previous Struts 2 + Hibernate integration example (servlet context listener), So the JSP and Hibernate configuration are almost same, just the integration part is a bit different, try to compare both to spot the different.

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.获取“完整的 Hibernate 插件”和依赖项

获取所有 Struts2、Hibernate、 Full Hibernate 插件和 MySQL 依赖库。由于“全 Hibernate 插件”不支持 Maven,您需要从官网下载并手动包含到您的 Maven 本地库。

  1. 下载“全休眠插件”。

  2. 将下载的 jar 放到 c: drive 中,并使用 Maven 的命令将其包含到 Maven 本地存储库中。

     mvn install:install-file -Dfile=c:\struts2-fullhibernatecore-plugin-2.2-GA.jar 
    -DgroupId=com.google.code -DartifactId=struts2-fullhibernatecore-plugin 
    -Dversion=2.2 -Dpackaging=jar 
    
  3. 用跟随 Maven 坐标链接它。

     <dependency>
    		<groupId>com.google.code</groupId>
    		<artifactId>struts2-fullhibernatecore-plugin</artifactId>
    		<version>2.2</version>
    	</dependency> 
    

以下是本教程中的所有依赖库:

文件:pom.xml

 //...
	<!-- Struts 2 -->
	<dependency>
	        <groupId>org.apache.struts</groupId>
		<artifactId>struts2-core</artifactId>
		<version>2.1.8</version>
        </dependency>

	<!-- MySQL database driver -->
	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.9</version>
	</dependency>

	<!-- Struts 2 Hibernate Plugins -->
	<dependency>
		<groupId>com.google.code</groupId>
		<artifactId>struts2-fullhibernatecore-plugin</artifactId>
		<version>2.2</version>
	</dependency>

	<!-- Log4j logging (Struts 2 Hibernate Plugins dependency) -->
	<dependency>
                <groupId>log4j</groupId>
	        <artifactId>log4j</artifactId>
	        <version>1.2.9</version>
        </dependency>

	<!-- Hibernate validator (Struts 2 Hibernate Plugins dependency) -->
	<dependency>
               <groupId>org.hibernate</groupId>
	       <artifactId>hibernate-validator</artifactId>
	       <version>3.1.0.GA</version>
        </dependency>

	<!-- slf4j logging (Struts 2 Hibernate Plugins dependency) -->
	<dependency>
               <groupId>org.slf4j</groupId>
	       <artifactId>slf4j-api</artifactId>
	       <version>1.6.1</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 -->
//... 

The “Full Hibernate Plugin” is required the Hibernate validator and SLF4j dependency, which is not really make sense, as most of the Java developers still do not use it.

4.冬眠的东西

所有的 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> 

文件:hibernate.cfg.xml,hibernate 数据库配置文件。

 <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
    <property name="hibernate.connection.password">password</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="show_sql">true</property>
    <property name="format_sql">true</property>
    <property name="use_sql_comments">false</property>
    <mapping resource="com/mkyong/customer/hibernate/Customer.hbm.xml" />
  </session-factory>
</hibernate-configuration> 

5.数据访问对象(Data Access Object)

实现 DAO 设计模式来执行数据库操作。在 CustomerDAOImpl 类中,将 Hibernate 会话和事务都声明为类成员。在 Struts 2 项目初始化过程中,全 Hibernate 插件会分别使用 @SessionTarget@TransactionTarget 注释将相应的 Hibernate 会话和事务注入到类成员中。

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.hibernate.Session;
import org.hibernate.Transaction;

import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget;
import com.mkyong.customer.dao.CustomerDAO;
import com.mkyong.customer.model.Customer;

public class CustomerDAOImpl implements CustomerDAO{
    
    

	@SessionTarget
	Session session;

	@TransactionTarget
	Transaction transaction;

	//add the customer
	public void addCustomer(Customer customer){
    
    

		session.save(customer);

	}

	//return all the customers in list
	public List<Customer> listCustomer(){
    
    

		return session.createQuery("from Customer").list();

	}

} 

6.行动

在 Action 类中,调用 DAO 类来执行数据库操作。

CustomerAction.java

 package com.mkyong.customer.action;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.mkyong.customer.dao.CustomerDAO;
import com.mkyong.customer.dao.impl.CustomerDAOImpl;
import com.mkyong.customer.model.Customer;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class CustomerAction extends ActionSupport 
	implements ModelDriven{
    
    

	Customer customer = new Customer();
	List<Customer> customerList = new ArrayList<Customer>();
	CustomerDAO customerDAO = new CustomerDAOImpl();

	public String execute() throws Exception {
    
    
		return SUCCESS;
	}

	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());
		customerDAO.addCustomer(customer);

		//reload the customer list
		customerList = null;
		customerList = customerDAO.listCustomer();

		return SUCCESS;

	}

	//list all customers
	public String listCustomer() throws Exception{
    
    

		customerList = customerDAO.listCustomer();

		return SUCCESS;

	}

} 

7.JSP 页面

添加和列出客户的 JSP 页面。

customer.jsp

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

<body>
<h1>Struts 2 Full Hibernate Plugin 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

Link it all ~ make 包扩展了“ hibernate-default ”而不是“ struts-default ”。

 <?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="hibernate-default">

    <action name="addCustomerAction" 
	class="com.mkyong.customer.action.CustomerAction" method="addCustomer" >
       <result name="success">pages/customer.jsp</result>
    </action>

    <action name="listCustomerAction" 
	class="com.mkyong.customer.action.CustomerAction" method="listCustomer" >
        <result name="success">pages/customer.jsp</result>
    </action>

</package>	
</struts> 

9.演示

访问它:http://localhost:8080/struts 2 example/listcustomeraction . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载源代码

Download it – Struts2-Hibernate-FullHibernatePluginExample.zip (12 KB)

参考

  1. Struts 2 全休眠插件文档
  2. Struts 2 + Hibernate 集成示例(servlet 上下文监听器)
  3. 将库安装到 Maven 本地存储库中

hibernate integration struts2

struts 2–i18n 或本地化示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-i18n-or-localization-example/

一个 Struts 2 国际化(i18n)、本地化(i10n)或多语言示例,展示了资源包的使用,以显示来自不同语言的消息。在本例中,您将创建一个简单的登录屏幕,通过 Struts 2 UI 组件显示资源包中的消息,并根据所选的语言选项更改区域设置。

Download It – Struts2-i18-localization-Example.zip

1.项目结构

本例的项目结构

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 ## 2.属性文件

确保属性文件被命名为国家指定代码。

In some “non-Europe” or “non-English” like characters, you should always encode the content with native2ascii tool.

global.properties

 #Global messages
global.username = Username
global.password = Password
global.submit = Submit 

全球 _zh_CN.properties

 #Global messages
global.username = \u7528\u6237\u540d
global.password = \u5bc6\u7801
global.submit=\u63d0\u4ea4 

全局 _fr .属性

 #Global messages
global.username = Nom d'utilisateur
global.password = Mot de passe
global.submit = Soumettre 

global_de.properties

 #Global messages
global.username = Benutzername
global.password = Kennwort
global.submit = Einreichen 

Please read this Struts 2 resource bundle example to understand how Struts 2 search the properties file automatically. ## 3.行动

两个 action 类, LocaleAction 基本上什么都不做, LoginAction 会通过 getText() 做一个简单的验证并显示资源包的错误信息。

local action . Java

 package com.mkyong.common.action;

import com.opensymphony.xwork2.ActionSupport;

public class LocaleAction extends ActionSupport{
    
    

	//business logic
	public String execute() {
    
    
		return "SUCCESS";
	}
} 

LoginAction.java

 package com.mkyong.user.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{
    
    

	private String username;
	private String password;

	//...getter and setter methods

	//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"));
		}
	}
} 

4.查看页面

带有文本框、密码和提交 UI 组件的登录页面。

To support Struts 2 localization, you HAVE TO declared the <%@ page contentType=”text/html;charset=UTF-8″ %> in your view page, else you will have problem to display the “UTF-8 data” correctly, especially the Chinese characters. Read this article about Struts 2 Chinese localization issue.

login.jsp

 <%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
</head>

<body>
<h1>Struts 2 localization example</h1>

<s:form action="validateUser" namespace="/user">

	<s:textfield key="global.username" name="username" />
	<s:password key="global.password" name="password"/>	
	<s:submit key="global.submit" name="submit" />

</s:form>

<s:url id="localeEN" namespace="/" action="locale" >
   <s:param name="request_locale" >en</s:param>
</s:url>
<s:url id="localezhCN" namespace="/" action="locale" >
   <s:param name="request_locale" >zh_CN</s:param>
</s:url>
<s:url id="localeDE" namespace="/" action="locale" >
   <s:param name="request_locale" >de</s:param>
</s:url>
<s:url id="localeFR" namespace="/" action="locale" >
   <s:param name="request_locale" >fr</s:param>
</s:url>

<s:a href="%{localeEN}" >English</s:a>
<s:a href="%{localezhCN}" >Chinese</s:a>
<s:a href="%{localeDE}" >German</s:a>
<s:a href="%{localeFR}" >France</s:a>

</body>
</html> 

To change the default locale, you just need to declared a “request_locale” parameter, set your prefer language code and pass to an Action class. In Struts 2 the com.opensymphony.xwork2.interceptor.I18nInterceptor interceptor, which declared in the struts-default.xml, will hijack your Action class and handle the locale stuff accordingly.

5.是否显示资源包消息?

在 Struts 2 中,有许多方法可以根据所选的语言或地区显示资源包消息。举个例子,

 <s:textfield key="global.username" name="username" />
<s:text name="global.username" />	
<s:property value="getText('global.username')" />
<s:text name="global.password" /> 

In Struts 1, there are one standard bean:message to display the resource bundle message, which is more prefer. But in Struts 2, there are so many equivalent ways to display the resource bundle message (even internal work is different), it’s quite confuse at the first glance. Basically, no matter what you choose, Struts 2 also will display the resource bundle message correctly.

6.struts.xml

Struts 2 配置文件,将它们链接在一起。

 <?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="login">
		<result>pages/login.jsp</result>
	   </action>
	   <action name="validateUser" class="com.mkyong.user.action.LoginAction">
		<result name="SUCCESS">pages/welcome.jsp</result>
		<result name="input">pages/login.jsp</result>
	   </action>
	</package>

	<package name="default" namespace="/" extends="struts-default">
	   <action name="locale" class="com.mkyong.common.action.LocaleAction">
		<result name="SUCCESS">user/pages/login.jsp</result>
	   </action>
	</package>

</struts> 

7.演示

http://localhost:8080/struts 2 example/user/log in . action
http://localhost:8080/struts 2 example/locale . action?request_locale=en

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://localhost:8080/struts 2 example/locale . action?request_locale=zh_CN

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://localhost:8080/struts 2 example/locale . action?request_locale=de

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://localhost:8080/struts 2 example/locale . action?request_locale=fr

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. http://struts.apache.org/2.1.8/docs/localization.html
  2. http://www . mkyong . com/Java/Java-convert-Chinese-character-to-unicode-with-native 2 ascii/
  3. http://www . mkyong . com/struts 2/struts-2-resource-bundle-example/
  4. http://www . mkyong . com/struts/struts-国际化-or-本地化-example/

multiple languages struts2

Struts 2 i18n 标签示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-i18n-tag-example/

Download It – Struts2-I18n-Tag-Example.zip

Struts 2 " i18n "标签用于从任何声明的资源包中获取消息,而不仅仅是与当前动作相关联的资源包。参见下面一个完整的“ i18n 标记示例:

1.行动

转发请求的操作类。

I18nTagAction.java

 package com.mkyong.common.action;

import com.opensymphony.xwork2.ActionSupport;

public class I18nTagAction extends ActionSupport{
    
    

	public String execute() throws Exception {
    
    

		return SUCCESS;
	}
} 

2.属性文件

用于演示的两个属性文件。

I18nTagAction.properties

 i18n.msg = "This is a message from I18nTagAction.properties" 

自定义属性

 i18n.msg = "This is a message from Custom.properties" 

3.i18n 标签示例

它展示了“ i18n ”标签的使用。

i18n.jsp

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

<body>
<h1>Struts 2 i18n tag example</h1>

<h2>1.Get message from I18nTagAction.properties</h2> 
Output : 
<s:text name="i18n.msg" />

<h2>2.Get message from Custom.properties</h2> 
Output : 
<s:i18n name="com/mkyong/common/action/Custom">
	<s:text name="i18n.msg" />
</s:i18n>

</body>
</html> 

它是如何工作的?

1.在示例 1 中,它将从与当前操作类(【I18nTagAction.properties】)关联的资源包( I18nTagAction.properties )中获取消息。

2.在示例 2 中,它将从位于**com/mkyong/common/action/**文件夹中的“ Custom.properties ”属性文件中获取消息。

DO NOT PUT .properties suffix
A very common mistake in the i18n tag, if you declared the properties file with a .properties suffix, Struts 2 will failed to get the message from the declared resource bundle.
WRONG WAY :

 <s:i18n name="com/mkyong/common/action/Custom.properties">
	<s:text name="i18n.msg" />
</s:i18n> 

正确方式 :
声明属性文件不带. properties 后缀

 <s:i18n name="com/mkyong/common/action/Custom">
	<s:text name="i18n.msg" />
</s:i18n> 

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="i18nTagAction" 
			class="com.mkyong.common.action.I18nTagAction" >
			<result name="success">pages/i18n.jsp</result>
		</action>

	</package>
</struts> 

5.演示

http://localhost:8080/struts 2 example/i18 ntagaction . action

输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. Struts 2 i18n 标签文档

struts2

Struts 2 If,ElseIf,Else 标签示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-if-elseif-else-tag-example/

Download It – Struts2-If-ElseIf-Else-Tag-Example.zip

Struts 2 If、ElseIf 和 Else 标签用于执行基本条件检查。

If '标签可以单独使用

 <s:if test="%{#variable=='String 1'}">
	This is String 1
</s:if> 

或者用’ Else If 标记

 <s:if test="%{#variable=='String 1'}">
	This is String 1
</s:if>
<s:elseif test="%{#variable=='String 2'}">
    This is String 2
</s:elseif> 

和/或单个/多个’ Else 标签。

 <s:if test="%{#variable=='String 1'}">
	This is String 1
</s:if>
<s:elseif test="%{#variable=='String 2'}">
    This is String 2
</s:elseif>
<s:else>
    Other Strings
</s:else> 

以上说法都是对的。让我们看一个例子来展示 Struts 2 ’ If,ElseIf 和 Else 标签的使用。

1.行动

一个带有字符串属性的 Action 类,它包含一个“ Struts 2 值。

IfTagAction

 package com.mkyong.common.action;

import com.opensymphony.xwork2.ActionSupport;

public class IfTagAction extends ActionSupport{
    
    

	private String framework = "Struts 2";

	public String getFramework() {
    
    
		return framework;
	}

	public void setFramework(String framework) {
    
    
		this.framework = framework;
	}

	public String execute() {
    
    
		return SUCCESS;
	}
} 

2.If、ElseIf 和 Else 标签示例

一个 JSP 页面,展示了使用 If、ElseIf 和 Else 标签对“框架变量执行条件检查。

if.jsp

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

<body>
<h1>Struts 2 If, Else, ElseIf tag example</h1>

<s:set name="webFramework" value="framework"/>

<s:if test="%{#webFramework=='Struts 2'}">
	This is Struts 2
</s:if>
<s:elseif test="%{#webFramework=='Struts 1'}">
    This is Struts 1
</s:elseif>
<s:else>
    Other framework
</s:else>

</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="ifTagAction" 
			class="com.mkyong.common.action.IfTagAction" >
			<result name="success">pages/if.jsp</result>
		</action>

	</package>

</struts> 

4.演示

http://localhost:8080/struts 2 example/iftagaction . action

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. Struts 2 If 标签文档
  2. Struts 2 ElseIf 标签文档
  3. Struts 2 Else 文档

struts2

Struts 2–包含多个 Struts 配置文件

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-include-multiple-struts-configuration-files/

Struts 2 带有“ include file ”特性,将多个 Struts 配置文件包含到一个单元中。

单个 Struts 配置文件

让我们看一个糟糕的 Struts 2 配置示例。

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>

<package name="default" namespace="/" extends="struts-default">
</package>

<package name="audit" namespace="/audit" extends="struts-default">
	<action name="WelcomeAudit">
		<result>pages/welcome_audit.jsp</result>
	</action>
</package>

<package name="user" namespace="/user" extends="struts-default">
	<action name="WelcomeUser">
		<result>pages/welcome_user.jsp</result>
	</action>
</package>

</struts> 

在上面的 Struts 配置文件中,它将所有的“用户”和“审计”、设置放在一个文件中,这是不推荐的,必须避免。您应该将这个 struts.xml 文件分成更多更小的模块相关部分。

Do not think this is a case study, it did happened in real life. I seen many Struts 1 or 2 developers just group everything in a single Struts configuration file. In fact, many are still don’t aware of the Struts’s include file feature. ## 多个 Struts 配置文件

在 Struts 2 中,您应该总是为每个模块分配一个 Struts 配置文件。在这种情况下,您可以创建三个文件:

  1. struts-audit . XML–将所有审计模块设置放在这里。
  2. struts-user . XML–将所有用户模块设置放在这里。
  3. struts . XML–使用默认设置并包含 struts-audit.xml 和 struts-user.xml。

struts-audit.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>

<package name="audit" namespace="/audit" extends="struts-default">
	<action name="WelcomeAudit">
		<result>pages/welcome_audit.jsp</result>
	</action>
</package>

</struts> 

struts-user.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>

<package name="user" namespace="/user" extends="struts-default">
	<action name="WelcomeUser">
		<result>pages/welcome_user.jsp</result>
	</action>
</package>

</struts> 

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>

<package name="default" namespace="/" extends="struts-default">
</package>

<include file="user/struts-user.xml"></include>
<include file="audit/struts-audit.xml"></include>

</struts> 

看看文件夹结构是什么样的

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Download this example – Struts2-Multiple-Struts-Config-Files-Example.zip ## 参考

  1. http://www . mkyong . com/struts/struts-multiple-configuration-files-example/
  2. http://www . mkyong . com/struts 2/struts-2-namespace-configuration-example-and-explain/

configuration file struts2

Struts 2 包含标签示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/struts2/struts-2-include-tag-example/

Download It – Struts2-Include-Tag-Example.zip

Struts 2 " include 标签用于将 JSP 或 HTML 页面直接包含到当前页面中。关于“包含标签的演示,请参见下面的示例。

1.行动

仅执行转发任务的简单操作类。

IncludeTagAction.java

 package com.mkyong.common.action;

import com.opensymphony.xwork2.ActionSupport;

public class IncludeTagAction extends ActionSupport{
    
    

	public String execute() throws Exception {
    
    

		return SUCCESS;
	}
} 

2.包括标签示例

它展示了如何使用 include 标签将一个【mkyong.jsp】的页面包含到当前页面中。

include.jsp

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

<body>
<h1>Struts 2 include tag example</h1>

<s:include value="/pages/mkyong.jsp"></s:include>

</body>
</html> 

mkyong.jsp

 <html>
<head>
</head>

<body>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<script>
(adsbygoogle = window.adsbygoogle || []).push({
    
    });
</script><h2>Message from mkyong.jsp</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="includeTagAction" 
			class="com.mkyong.common.action.IncludeTagAction" >
			<result name="success">pages/include.jsp</result>
		</action>

	</package>
</struts> 

4.演示

http://localhost:8080/struts 2 example/include tagaction . action

输出

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

参考

  1. Struts 2 包含标签文档

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/20190304032715/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)

猜你喜欢

转载自blog.csdn.net/wizardforcel/article/details/143497806