Loading...
My Blog 我的工作和学习笔记

Struts2专题之四:Action的定义和Form表单参数处理

Struts2专题 2015/12/31 Struts2

接Struts2专题上一篇

1、Action的定义,以及mapping映射描述,看代码注释

Action在MVC中充当Controller控制器的角色,Struts2定义一个Action类通常继续ActionSupport类。

package cn.imethan.web.struts2;
import com.opensymphony.xwork2.ActionSupport;
/**
 * HelloWorldAction.java
 *
 * @author Ethan Wong
 * @since JDK 1.7
 * @datetime 2015年12月31日上午9:39:42
 */ 
public class HelloWorldAction extends ActionSupport { 
    private static final long serialVersionUID = 1L; 
    private MessageStore messageStore;     
    public String execute() throws Exception {         
        messageStore = new MessageStore() ;
        return SUCCESS;//对应配置文件里面的 "success"
    } 
    public MessageStore getMessageStore() {
        return messageStore;
    } 
    public void setMessageStore(MessageStore messageStore) {
        this.messageStore = messageStore;
    } 
}


<!-- method方法指定Action调用执行的方法名称 -->
<action name="hello" class="org.apache.struts.helloworld.action.HelloWorldAction" method="execute">
    <!-- result的名称指定返回名称,对用配置的jsp页面 -->
    <result name="success">/WEB-INF/view/HelloWorld.jsp</result>
</action>


2、Action中添加私有变量,处理from或者url提交的参数

在HelloWorldAction中添加如下私有变量userName和get、set方法

    private String userName;    
    public String getUserName() {
        return userName;
    }     
    public void setUserName(String userName) {
        this.userName = userName;
    }

index.jsp添加如下表单内容:

 <s:form action="hello">
   <s:textfield name="userName" label="Your name" />
    <s:submit value="Submit" />
 </s:form>

HelloWorld.jsp添加userName展现内容:

<p>userName:<s:property value="userName"/> </p>


部署运行项目,提交表单参数,执行name为hello的Action,浏览器返回结果如下:

userName:imethan,其中imethan是输入表单提交的内容。


3、通过创建Model类,在Model类中设置变量,用于接收表单参数

创建PersonModel类、RegisterAction Action类、register.jsp注册表单页面和成功返回页面thankyou.jsp、struts.xml配置文件添加Action节点

public class Person {
 
 private String firstName;
 private String lastName;
 private String email;
 private int 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 String getEmail() {
  return email;
 }

 public void setEmail(String email) {
  this.email = email;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public String toString() {
  return "First Name: " + getFirstName() + " Last Name:  " + getLastName() + " Email:      " + getEmail() + " Age:      " + getAge();
 }
}


RegisterAction

import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private Person personBean;
    
    public String register(){
     return "register";
    }
 
    @Override
    public String execute() throws Exception {
        //call Service class to store personBean's state in database
        return SUCCESS;
    }
     
    public Person getPersonBean() {
        return personBean;
         
    }
     
    public void setPersonBean(Person person) {
        personBean = person;
    }
}

register.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Register</title>
</head>
<body>
<h3>Register for a prize by completing this form.</h3>
<s:form action="register">
      <s:textfield name="personBean.firstName" label="First name" />
      <s:textfield  name="personBean.lastName" label="Last name" />
      <s:textfield name="personBean.email"  label ="Email"/>  
      <s:textfield name="personBean.age"  label="Age"  />
      <s:submit/>
</s:form>
</body>
</html>

thankyou.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Registration Successful</title>
</head>
<body>
 <h3>Thank you for registering for a prize.</h3>
 <p>Your registration information: <s:property value="personBean" /> </p>
 <p><a href="<s:url action='enter' />" >Return to home page</a>.</p>
</body>
</html>


<action name="enter" class="cn.imethan.web.struts2.RegisterAction" method="register">
    <result name="register">/WEB-INF/view/register.jsp</result>
</action>       
<action name="register" class="cn.imethan.web.struts2.RegisterAction" method="execute">
    <result name="success">/WEB-INF/view/thankyou.jsp</result>
</action>


创建完成后,部署运行,http://localhost:8080/enter.action,输入表单信息如下:

Register for a prize by completing this form.


提交返回信息如下:

Thank you for registering for a prize.

Your registration information: First Name: ethan Last Name:  wong Email:      ethan@qq.com Age:      100

Return to home page.



参考文档

http://struts.apache.org/docs/getting-started.html

Struts2专题之三:Struts2 Tags标签库的使用

Struts2专题 2015/12/31 Struts2

国际惯例,在上一篇的基础之上继续

1、使用Struts2的tag标签库之前,需要在jsp页面的开头引入:<%@ taglib prefix="s" uri="/struts-tags" %>

2、<s:url action='hello'/>说明

在index.jsp中的代码<a href="<s:url action='hello'/>">Hello World</a>,在页面展示时鼠标移动到上面会显示带有“/hello.action”后缀的完整访问路径:http://localhost:8080/hello.action


点击该将链接执行struts.xml配置文件中的如下Action:

        <action name="hello" class="cn.imethan.web.struts2.HelloWorldAction" method="execute">
              <result name="success">/WEB-INF/view/HelloWorld.jsp</result>
        </action>

3、url tag标签设置参数

<s:url action="hello" var="helloLink">
  <s:param name="userName">Bruce Phillips</s:param>
</s:url>
 
<p><a href="<s:property value="helloLink"/>">Hello Bruce Phillips</a></p>

<s:property value="helloLink"/>展现出来的内容是带有“/hello.action?userName=Bruce+Phillips”后缀的完整访问路径:http://localhost:8080/hello.action?userName=Bruce+Phillips


4、form tag标签

<p>Get your own personal hello by filling out and submitting this form.</p> 
<s:form action="hello"> 
  <s:textfield name="userName" label="Your name" />     
   <s:submit value="Submit" /> 
</s:form>

上述内容在页面展现时会转换为如下:

<form id="hello" name="hello" action="/Using_Tags_Struts2_Mvn/hello.action;jsessionid=3471d76027b5342cab44f297b567" method="post">
 <table class="wwFormTable"> 
<tr>
    <td class="tdLabel"><label for="hello_userName" class="label">Your name:</label></td>
    <td><input type="text" name="userName" value="" id="hello_userName"/></td>
</tr> 
<tr>
    <td colspan="2"><div align="right"><input type="submit" id="hello_0" value="Submit"/>
</div></td>
</tr> 
</table>
</form>

5、property tag标签


package cn.imethan.web.struts2;
/**
 * MessageStore.java
 *
 * @author Ethan Wong
 * @since JDK 1.7
 * @datetime 2015年12月31日上午9:39:12
 */
public class MessageStore {
    private String message;
    public MessageStore() {
        setMessage("Hello Struts User");
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

<s:property value="messageStore.message" />展示messageStore.message内容为:Hello Struts User

<s:property value="messageStore" />展示的信息为:cn.imethan.web.struts2.MessageStore@353272b9

重写类MessageStore的toString方法后:

    @Override
    public String toString() {
        return "MessageStore [message=" + message + "]";
    }

<s:property value="messageStore" />展示的信息为:MessageStore [message=Hello Struts User]


参考文档

http://struts.apache.org/docs/getting-started.html

Struts2专题之二:Struts2 WEB应用的Hello World

Struts2专题 2015/12/31 Struts2

在上一篇描述的基础之上继续

1、创建Model类MessageStore.java

package cn.imethan.web.struts2;
/**
 * MessageStore.java
 *
 * @author Ethan Wong
 * @since JDK 1.7
 * @datetime 2015年12月31日上午9:39:12
 */
public class MessageStore {
 private String message;
 public MessageStore() {
  setMessage("Hello Struts User");
 }
 public String getMessage() {
  return message;
 }
 public void setMessage(String message) {
  this.message = message;
 }
}


2、创建Action类HelloWorldAction.java

package cn.imethan.web.struts2;
import com.opensymphony.xwork2.ActionSupport;
/**
 * HelloWorldAction.java
 *
 * @author Ethan Wong
 * @since JDK 1.7
 * @datetime 2015年12月31日上午9:39:42
 */ 
public class HelloWorldAction extends ActionSupport { 
    private static final long serialVersionUID = 1L; 
    private MessageStore messageStore;     
    public String execute() throws Exception {         
        messageStore = new MessageStore() ;
        return SUCCESS;
    } 
    public MessageStore getMessageStore() {
        return messageStore;
    } 
    public void setMessageStore(MessageStore messageStore) {
        this.messageStore = messageStore;
    } 
}


3、创建JSP视图View HelloWorld.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World!</title>
</head>
<body>
 <h2><s:property value="messageStore.message" /></h2>
</body>
</html>

4、struts.xml配置文件添加action配置

<?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="basicstruts2" extends="struts-default"> 
        <action name="index">
            <result>/WEB-INF/view/index.jsp</result>
        </action>        
        <action name="hello" class="cn.imethan.web.struts2.HelloWorldAction" method="execute">
        <result name="success">/WEB-INF/view/HelloWorld.jsp</result>
     </action>        
    </package> 
</struts>


5、在index.jsp中创建url调用

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Basic Struts 2 Application - Welcome</title>
</head>
<body>
 <h2>Welcome to Struts 2!</h2>
 <p><a href="<s:url action='hello'/>">Hello World</a></p>
</body>
</html>


6、运行程序并且使用浏览器访问http://localhost:8080/imethan-struts2/index.action,返回index.jsp页面内容:

Welcome to Struts 2!

Hello World


点击“Hello World”,返回HelloWorld.jsp页面内容:

Hello Struts User


参考文档

http://struts.apache.org/docs/getting-started.html


Struts2专题之一:创建一个简单Struts2 WEB应用

Struts2专题 2015/12/30 Struts2

1、创建一个java maven web项目

pom.xml文件内容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" 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>cn.imethan.web.struts2</groupId>
	<artifactId>imethan-struts2</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>imethan-struts2 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>
	</dependencies>

	<build>
		<finalName>imethan-struts2</finalName>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>
</project>


2、往pom.xml中添加Struts2和log4j2的 maven依赖

<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.3.24.1</version>
		</dependency>
		
		<!-- log4j2 begin -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-api</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-slf4j-impl</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-jcl</artifactId>
			<version>2.4</version>
		</dependency>
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-web</artifactId>
			<version>2.4</version>
		</dependency>
		<!-- log4j2 end -->


3、将log4j2.xml配置文件放到“WEB-INF”目录下

<?xml version="1.0" encoding="UTF-8"?>
<!-- status表示log4j事件输出控制台级别,分别有"trace", "debug", "info", "warn", "error","fatal" -->
<!-- monitorInterval表示log4j会自动监听配置文件的变动,最小监听时间为5秒 -->
<Configuration status="WARN" monitorInterval="5">

   <!-- 通用属性配置 -->
  <Properties>
    <Property name="appname">imethan-web</Property>
  </Properties>
  
  <!-- 默认过滤等级 -->
  <ThresholdFilter level="trace"/>
  
  <Appenders>
  	<!-- 控制台输出 -->
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    
    <!-- 每日文件记录 -->
	<RollingFile name="RollingFile" fileName="logs/${appname}.log" filePattern="logs/${appname}-%d{MM-dd-yyyy}.log.gz">
      <BurstFilter level="warn" rate="16" maxBurst="100"/>
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
    </RollingFile>
	<RollingFile name="RollingFileError" fileName="logs/${appname}-error.log" filePattern="logs/${appname}-error-%d{MM-dd-yyyy}.log.gz">
      <ThresholdFilter level="error" />
      <PatternLayout>
        <pattern>%d %p %c{1.} [%t] %m%n</pattern>
      </PatternLayout>
      <TimeBasedTriggeringPolicy />
    </RollingFile>
    
    <!-- NoSql数据库记录 
    <NoSql name="databaseAppender" ignoreExceptions="false">
      <MongoDb databaseName="database" collectionName="applicationLog" server="127.0.0.1"
               username="" password="" />
    </NoSql>
    -->
        
  </Appenders>
  
  <Loggers>
  	<!-- 全局日志记录 -->
    <Root level="debug">
      <AppenderRef ref="Console"/>
      <AppenderRef ref="RollingFile"/>
      <AppenderRef ref="RollingFileError"/>
    </Root>
    
  </Loggers>
</Configuration>


4、往web.xml配置文件中添加Struts2 Servlet过滤器、log4j2监听器和过滤器

    <!-- log4j2 web2.0 begin -->
    <listener>
        <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
    </listener>
    <filter>
        <filter-name>log4jServletFilter</filter-name>
        <filter-class>org.apache.logging.log4j.web.Log4jServletFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>log4jServletFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>INCLUDE</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>
    <!-- log4j2 web2.0 end-->

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

5、将struts2.xml放到“src/main/resources”下,并且在“WEB-INF/view”目录下创建index.jsp文件

<?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="basicstruts2" extends="struts-default"> 
        <action name="index">
            <result>/WEB-INF/view/index.jsp</result>
        </action> 
    </package> 
</struts>


<html>
	<body>
	<h2>Welcome to Struts 2!</h2>
	</body>
</html>


6、 Jetty运行启动,浏览器访问:http://localhost:8080/imethan-struts2/index.action,返回index.jsp页面内容:

Welcome to Struts 2!


参考文档

http://struts.apache.org/docs/getting-started.html




Struts2专题开篇:写在前面的话

Struts2专题 2015/12/29 Struts2

    在大学的时候学校就有开设一门Struts的课程,当时学习的是Struts1,2010年暑假自己自学了Struts2,步入工作岗位后便开始使用Struts2,后来Struts2爆出了一些列的漏洞事件,在后续的项目MVC框架便选择了Spring MVC。

    目前JAVA WEB界还是有很多人在用Struts2,所以借着之前学习以及实际生产的经验,重新这里一下Struts2的应用知识。

   

    Struts2是在Struts1和Webwork这两个框架互相取长补短整合后再开发的Struts新一代产物。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。


    Struts2是一个MVC模式的框架,MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。


参考资料

http://struts.apache.org/

http://struts.apache.org/docs/guides.html

http://struts.apache.org/docs/tutorials.html