Strude2 学习之旅
第一个项目HelloWorld
创建一个helloworld,需要做四件事:
- 建立一个存储"欢迎"信息的类(the model)
- 建立一个展示这个消息的服务器网页(the view)
- 创建一个Action class来控制用户、模型、视图之间的交互
- 对Action class和view建立一个映射mapping(struts.xml)
让我们创建一个基本的Struts project,需要添加一个用于存储数据的模型(model),一个显示信息的页面(view),一个扮演控制(controller)的Action class和一个配置文件来将上述联系在一起。
Step1 创建Model类MessageStore.java
MessageStore.java
package org.apache.struts.helloworld.model;
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; } } |
一定要为message设置set和get方法来允许访问私有变量message。
Step2 创建一个Action Class HelloWorldAction.java
我们需要一个Action class来充当控制器(Controller)。Action class会响应一个用户动作(例子中,用户点击一个html链接,发送一个特定的url到servlet容器)。一个或多个Action类的方法将被执行,并返回一个字符串结果,基于结果的值,一个指定的view page(例子中是HelloWorld.jsp)将会呈现。
HelloWorldAction.java
package org.apache.struts.helloworld.action;
import org.apache.struts.helloworld.model.MessageStore;
import com.opensymphony.xwork2.ActionSupport;
public class HelloWorldAction extends ActionSupport {
private static final long serialVersionUID = 1L;
private MessageStore messageStore;
public String excute() throws Exception{
messageStore = new MessageStore();
return SUCCESS;
}
public MessageStore getMessageStore() {
return messageStore;
}
public void setMessageStore(MessageStore messageStore) {
this.messageStore = messageStore;
}
}
Struts2框架将建立一个HelloWorldAction的对象,执行execute方法来响应用户操作(用户点击链接,发送特定的url到servlet容器)。
这个例子中execute方法创建了一个MessageStore对象然后返回一个SUCCESS字符串。
为了让前台jsp页面中获取到对象信息(MessageStore对象),需要设置set、get方法。
Step3 建立一个View HelloWorld.jsp
HelloWorld.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Hello World!</title>
</head>
<body>
<h2><s:property value="messageStore.message"></s:property></h2>
<s:debug>debugger</s:debug>
</body>
</html>
s:property标签显示出通过调用HelloWorldAction控制器中getMessageStore 方法所返回来的值。方法返回一个MessageStore的对象。通过.message我们告诉struts2来调取MessageStore的getMessage方法。之后返回一个String字符串,这个字符串就被显示在了s:property标签中。
Step4 添加Struts配置信息到struts.xml中
我们需要映射将url、HelloWorldAction class(controller)和HelloWorld.jsp联系在一起。这个映射告诉Struts2哪个class要响应用户的动作(The URL),哪个方法将要被执行,什么内容将要被展示在View中。
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="basicstruts2" extends="struts-default">
<action name="index">
<result>/index.jsp</result>
</action>
<action name="hello" class="org.apache.struts.helloworld.action.HelloWorldAction" method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
</package>
</struts>
Step5 建立URL Action
在index.jsp中让我们添加一个Action URL,用户点击后会告诉Struts2执行HelloWorldAction的execute方法,显示在HelloWorld.jsp页面中。
HelloWorld.jsp
<body>
<p><a href="<s:url action='hello'/>">Hello World</a></p> <br>
<a href="hello.action">nihao</a>
</body>
Step6 建立WAR文件并运行程序
Struts2的强大标签库
要使用Struts2的标签库,需要在页面中引入
<%@ taglib prefix="s" uri="/struts-tags" %>
-
Struts2 url Tag
<body>
<p><a href="<s:url action='hello'/>">Hello World</a></p> <br>
<a href="hello.action">nihao</a><br>
<s:url action="hello" var="he">
<s:param name="userName">Bru T</s:param>
</s:url>
<p><a href="${he}"> hehe</a></p>
</body>
将action="hello"中的内容存入到变量he中,以便以后使用。
Stack Context:
-
Struts2 Form Tag
<p>Get your own personal hello by filling out and submitting this form.</p>
<s:form action="hello">
<s:textfield name="userName2" lable="Your name"/>
<s:submit value="提交"></s:submit>
</s:form>
3、Struts 2 property tag
Struts Property Tag
<s:property value="messageStore.message"></s:property>
如果返回的值是一个object,那将会调用此对象的toString()方法,所以最好在类中复写toString()方法。
编写 Struts 2 Actions
Introduction
编写Struts2 Actions 需要如下几步:
- 映射一个动作Action到一个类class。
- 映射一个结果result到一个视图View
- 在Action class中写出控制逻辑
1、Struts 2 Action Classes
Action class在MVC模式中充当Controller。Action class响应用户操作,执行业务逻辑(或者交给其它类来做),然后返回一个result告诉Struts将展示哪一个View。
Struts 2 Action classes 通常要继承ActionSupport class,如果你继承了ActionSupport,就要复写其中的execute()方法。
在execute方法中,我们要写出响应用户操作的逻辑方法。
Method execute of HelloWorldAction
public String execute() throws Exception{
messageStore = new MessageStore();
helloCount++;
return SUCCESS;
}
2、Processing Form Input In The Action Class
Action class的一个最常见的职责是处理form中用户输入的信息,然后返回结果到一个可用的View页面。
Struts 2 Form Tags
<s:form action="hello">
<s:textfield name="userName" label="your name"/>
<s:submit value="Submit" />
</s:form>
当用户点击Submit按钮,属性名为name的textfield标签内容将被发送到Action class。Action class会自动接受form表单内容,前提是class中有匹配form属性名的set和get方法。
Add userName to HelloWorldAction
private String userName;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
个性化信息:(在execute方法中添加)
Add userName value to message
if(userName!=null){
messageStore.setMessage(messageStore.getMessage()+"::"+userName);
}
处理Form
Introduction
下面将要学习使用Struts2处理对于form提交更多的处理办法。如何使用一个Java Model存储form提交的数据,如何使一个Struts2 form与model class相匹配。
1、Forms and A Java Model Class
我们将提供用户的姓名,邮箱,年龄来设计业务规则。遵循Java bean规范,我们将封装这些数据并提供set和get方法,有时会需要复写toString()方法。
Person.java
package org.apache.struts.register.model;
public class Person {
private String name;
private int age;
private String email;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String toString(){
return "姓名: "+getName()+" 年龄:"+getEmail()+" 邮箱: "+getEmail();
}
}
2、建立Form
register.jsp
<h3>Register for a prize by completing this form.</h3>
<s:form action="register">
<s:textfield name="person.name" label="姓名"/>
<s:textfield name="person.age" label="年龄" />
<s:textfield name="person.email" label="邮箱"></s:textfield>
<s:submit value="提交"></s:submit>
</s:form>
表单信息将被提交到一个名为register的action,我们需要在struts.xml中定义这个action。
3、创建Action类来处理表单提交
package org.apache.struts.register.action;
import org.apache.struts.register.model.Person;
import com.opensymphony.xwork2.ActionSupport;
public class Register extends ActionSupport{
private static final long serialVersionUID = 2173209653712478187L;
private Person person;
public String execute() throws Exception{
person = new Person();
return SUCCESS;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
当用户点击提交后,将会调用Register class并创建Person对象,调用setPerson方法,然后把表单项与Person属性进行匹配。这些都发生在执行execute方法之前。
4、处理Execute Method返回的结果值
thankyou.jsp
<html xmlns="http://www.w3.org/1999/xhtml">
<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>您的注册信息为:<s:property value="person"></s:property></p>
<p><a href="<s:url action='index'/>">Return To HOME PAGE</a></p>
</body>
</html>
5、在struts.xml中建立 action Node
<action name="register" class="org.apache.struts.register.action" method="execute">
<result name="success">/thankyou.jsp</result>
</action>
当执行action中的execut方法返回值为"success"时,会告诉浏览器跳转到thankyou.jsp。
6、链接到register.jsp
在index.jsp中创建链接到register.jsp的超链接。
<a href="register.jsp">注册</a>