Struts.xml 文件
代码
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts./dtds/struts-2.0.dtd">
- <struts>
- <constant name="struts.enable.DynamicMethodInvocation" value="true" />
- <constant name="struts.devMode" value="true" />
- <include file="helloworld.xml"/>
- </struts>
HelloWorld.xml
代码
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
- "http://struts./dtds/struts-2.0.dtd">
- <struts>
- <include file="struts-default.xml"/>
- <package name="helloworld" namespace="/" extends="struts-default">
- <interceptors>
- <interceptor name ="authentication" class ="com.jamesby.struts2.LogonInterceptor"/>
- <interceptor-stack name="helloWorldStack">
- <interceptor-ref name="authentication"/>
- <interceptor-ref name="paramsPrepareParamsStack"/>
- </interceptor-stack>
- </interceptors>
- <default-interceptor-ref name="helloWorldStack"/>
- <global-results>
- <result name="login">/WEB-INF/jsp/Logon.jsp</result>
- </global-results>
- <action name="Logon_*" method="{1}" class="com.jamesby.struts2.Logon">
- <interceptor-ref name="paramsPrepareParamsStack"/>
- <result type="redirect-action">Main</result>
- <result name="input">/WEB-INF/jsp/Logon.jsp</result>
- </action>
- <action name="crud" method="{1}" class="com.jamesby.struts2.UserAction">
- <result name="list">/WEB-INF/jsp/userList.jsp</result> <result name="success" type="redirect-action">crud!list</result>
- <result name="input">/WEB-INF/jsp/userForm.jsp</result>
- </action>
- <action name="*" class="com.jamesby.struts2.ExampleSupport">
- <result>/WEB-INF/jsp/{1}.jsp</result>
- </action>
- </package>
- </struts>
LogonInterceptor.java
代码
- package com.jamesby.struts2;
- import java.util.Map;
- import com.jamesby.struts2.persist.User;
- import com.opensymphony.xwork2.Action;
- import com.opensymphony.xwork2.ActionInvocation;
- import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
- public class LogonInterceptor extends AbstractInterceptor{
- @Override
- public String intercept(ActionInvocation ai) throws Exception {
- Map session = ai.getInvocationContext().getSession();
- User user = (User) session.get("user");
- if (null != user) {
- return ai.invoke();
- } else {
- return Action.LOGIN;
- }
- }
- }
Logon.java
代码
- package com.jamesby.struts2;
- import java.util.Map;
- import org.apache.struts2.interceptor.SessionAware;
- import org.apache.struts2.interceptor.validation.SkipValidation;
- import com.jamesby.struts2.persist.DataBaseMock;
- import com.jamesby.struts2.persist.User;
- import com.opensymphony.xwork2.ActionSupport;
- public class Logon extends ActionSupport implements SessionAware {
- private Map session;
- public void setSession(Map session) {
- this.session = session;
- }
- @SkipValidation
- public String doInput() throws Exception {
- return INPUT;
- }
- public String doLogon() throws Exception {
- User user = DataBaseMock.selectUserByUsernameAndPassword(getUsername(),
- getPassword());
- if (null == user)
- return INPUT;
- session.put("user", user);
- return SUCCESS;
- }
- private String username;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- private String password;
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
UserAction.java
代码
- package com.jamesby.struts2;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import org.apache.struts2.interceptor.validation.SkipValidation;
- import com.jamesby.struts2.persist.DataBaseMock;
- import com.jamesby.struts2.persist.User;
- import com.opensymphony.xwork2.ActionSupport;
- public class UserAction extends ActionSupport {
- private User user=new User();
- private List<User> userList;
- public List<HashMap> getSexArray() {
- List<HashMap> sexArray = new ArrayList<HashMap>();
- HashMap male = new HashMap();
- male.put("key",new Integer(1));
- male.put("value","男");
- HashMap female = new HashMap();
- female.put("key",new Integer(2));
- female.put("value","女");
- sexArray.add(male);
- sexArray.add(female);
- return sexArray;
- }
- public List<HashMap> getFromArray() {
- List<HashMap> fromArray = new ArrayList<HashMap>();
- HashMap bj = new HashMap();
- bj.put("id",new Integer(1));
- bj.put("name","北京");
- HashMap sh = new HashMap();
- sh.put("id",new Integer(2));
- sh.put("name","上海");
- HashMap tj = new HashMap();
- tj.put("id",new Integer(3));
- tj.put("name","天津");
- fromArray.add(bj);
- fromArray.add(sh);
- fromArray.add(tj);
- return fromArray;
- }
- @SkipValidation
- public String doList() throws Exception {
- userList = DataBaseMock.selectAllUser();
- return "list";
- }
- @SkipValidation
- public String doInput() {
- return INPUT;
- }
- public String doSave() {
- if (null == user.getUserid()) {
- user.setUserid(new Integer(DataBaseMock.getNewUserId()));
- DataBaseMock.saveUser(user);
- }else
- {
- DataBaseMock.updateUser(user);
- }
- return SUCCESS;
- }
- @SkipValidation
- public String doRead()
- {
- user = DataBaseMock.getUser(user.getUserid());
- return INPUT;
- }
- @SkipValidation
- public String doDelete() {
- DataBaseMock.deleteUser(user);
- return SUCCESS;
- }
- public List<User> getUserList() {
- return userList;
- }
- public void setUserList(List<User> userList) {
- this.userList = userList;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
ExampleSupport.java
代码
- package com.jamesby.struts2;
- import com.opensymphony.xwork2.ActionSupport;
- public class ExampleSupport extends ActionSupport {
- }
User.java
代码
- package com.jamesby.struts2.persist;
- public class User {
- private Integer userid;
- private String username;
- private String password;
- private int sex;
- private int age;
- private int from;
- public int getFrom() {
- return from;
- }
- public void setFrom(int from) {
- this.from = from;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public int getSex() {
- return sex;
- }
- public void setSex(int sex) {
- this.sex = sex;
- }
- public Integer getUserid() {
- return userid;
- }
- public void setUserid(Integer userid) {
- this.userid = userid;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
DataBaseMock.java
代码
- package com.jamesby.struts2.persist;
- import java.util.ArrayList;
- import java.util.List;
- public class DataBaseMock {
- private static List<User> _cache = new ArrayList<User>();
- private static int userid = 0;
- static {
- User user = new User();
- user.setUserid(new Integer(0));
- user.setUsername("admin");
- user.setPassword("12345688");
- user.setFrom(1);
- user.setSex(1);
- user.setAge(18);
- _cache.add(user);
- }
- public static User selectUserByUsernameAndPassword(String username,String password)
- {
- for (User u : _cache) {
- if (u.getUsername().equals(username)&&u.getPassword().equals(password)) {
- return u;
- }
- }
- return null;
- }
- public static List<User> selectAllUser()
- {
- return _cache;
- }
- public static int getNewUserId() {
- return ++userid;
- }
- public static void saveUser(User user) {
- _cache.add(user);
- }
- public static void updateUser(User user) {
- deleteUser(user);
- saveUser(user);
- }
- public static void deleteUser(User user) {
- for (User u : _cache) {
- if (u.getUserid().intValue() == user.getUserid().intValue()) {
- _cache.remove(u);
- break;
- }
- }
- }
- public static User getUser(Integer userid) {
- return _cache.get(userid);
- }
- }
Logon-validation.xml
代码
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www./xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <field name="username">
- <field-validator type="requiredstring">
- <message key="requiredstring"/>
- </field-validator>
- </field>
- <field name="password">
- <field-validator type="requiredstring">
- <message key="requiredstring"/>
- </field-validator>
- </field>
- </validators>
UserAction-validation.xml
代码
- <!DOCTYPE validators PUBLIC
- "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
- "http://www./xwork/xwork-validator-1.0.2.dtd">
- <validators>
- <field name="user.username">
- <field-validator type="requiredstring">
- <message key="errors.required.username"/>
- </field-validator>
- </field>
- <field name="user.password">
- <field-validator type="requiredstring">
- <message key="errors.required.password"/>
- </field-validator>
- </field>
- <field name="user.sex">
- <field-validator type="required">
- <message key="errors.required.sex"/>
- </field-validator>
- </field>
- <field name="user.age">
- <field-validator type="required" short-circuit="true">
- <message key="errors.required.age"/>
- </field-validator>
- <field-validator type="int">
- <param name="min">18</param>
- <param name="max">65</param>
- <message key="errors.required.age.limit"/>
- </field-validator>
- </field>
- <field name="user.from">
- <field-validator type="required">
- <message key="errors.required.from"/>
- </field-validator>
- </field>
- </validators>
package.properties
代码
- requiredstring = $\{getText(fieldName)} is required.
- password = Password
- username = User Name
- main.message = This is main page...................
- label.userList= All User List
-
- user.username=Username
- user.password=Password
- user.sex=Sex
- user.age=Age
- user.from=From
-
- errors.required.username=Username is required
- errors.required.password=Password is required
- errors.required.sex=Sex is Required
- errors.required.from=From is Required
- errors.required.age.limit=Age between 18 and 65
- errors.required.age.limit=Age between 18 and 65
Logon.jsp
代码
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <html>
- <head>
- <title>Logon</title>
- </head>
- <body>
- <s:form action="Logon!logon">
- <s:textfield label="%{getText(‘username‘)}" name="username"/>
- <s:password label="%{getText(‘password‘)}" name="password" />
- <s:submit/>
- </s:form>
- </body>
- </html>
userList.jsp
代码
- <%@ page contentType="text/html;charset=GBK"%>
- <%@taglib prefix="s" uri="/struts-tags" %>
-
- <head>
- <title><s:text name="label.userList"/></title>
- </head>
-
- <s:url id="url" action="crud!input" />
- <a href="<s:property value="#url"/>">Add New User</a>
- <br>
- <table border="1">
- <tr class="<s:if test="#status.even">even</s:if><s:else>odd</s:else>">
- <td>用户ID</td>
- <td>用户名</td>
- <td>性别</td>
- <td>年龄</td>
- <td>来自</td>
- <td>修改</td>
- <td>删除</td>
- </tr>
- <s:iterator value="userList" status="status">
- <tr class="<s:if test="#status.even">even</s:if><s:else>odd</s:else>">
- <td><s:property value="userid" /></td>
- <td><s:property value="username" /></td>
- <td>
- <s:if test="sex==1">男</s:if>
- <s:else>女</s:else>
- </td>
- <td><s:property value="age" /></td>
- <td>
- <s:if test="from==1">北京</s:if>
- <s:if test="from==2">上海</s:if>
- <s:if test="from==3">天津</s:if>
- </td>
- <td>
- <a href="crud!read.action?user.userid=<s:property value="userid" />">修改</a>
- </td>
- <td>
- <a href="crud!delete.action?user.userid=<s:property value="userid" />">删除</a>
- </td>
- </tr>
- </s:iterator>
- </table>
userForm.jsp
代码
- <%@ page contentType="text/html;charset=GBK"%>
- <%@taglib prefix="s" uri="/struts-tags" %>
- User Form
- <s:form action="crud!save.action" method="post">
- <s:textfield required="true" name="user.username" value="%{user.username}" label="%{getText(‘user.username‘)}" size="40"/>
- <s:textfield required="true" name="user.password" value="%{user.password}" label="%{getText(‘user.password‘)}" size="40"/>
- <s:radio required="true" name="user.sex" listKey="key" listValue="value" value="%{user.sex}" label="%{getText(‘user.sex‘)}" list="sexArray"/>
- <s:textfield required="true" name="user.age" value="%{user.age}" label="%{getText(‘user.age‘)}" size="40"/>
- <s:select label="%{getText(‘user.from‘)}" name="user.from" headerKey="" headerValue="Select From" list="fromArray" listKey="id" listValue="name" value="user.from" required="true"/>
- <s:hidden name="user.userid" value="%{user.userid}"/>
- <s:submit value="Submit"/>
- <s:submit value="Cancel" name="redirect-action:crud!list"/>
- </s:form>
应用程序目录结构
代码
- WEB-INF
- │ web.xml
- │
- ├─classes
- │ │ commons-logging.properties
- │ │ helloworld.xml
- │ │ log4j.properties
- │ │ struts.properties
- │ │ struts.xml
- │ │
- │ └─com
- │ └─jamesby
- │ └─struts2
- │ │ ExampleSupport.class
- │ │ Logon-validation.xml
- │ │ Logon.class
- │ │ LogonInterceptor.class
- │ │ package.properties
- │ │ UserAction-validation.xml
- │ │ UserAction.class
- │ │
- │ └─persist
- │ DataBaseMock.class
- │ User.class
- │
- ├─jsp
- │ Logon.jsp
- │ Main.jsp
- │ userForm.jsp
- │ userList.jsp
- │
- ├─lib
- commons-collections-3.1.jar
- commons-logging-1.0.4.jar
- freemarker-2.3.8.jar
- log4j-1.2.9.jar
- ognl-2.6.11.jar
- struts2-core-2.0.6.jar
- xwork-2.0.1.jar
|
本事例首先自己编写了一个拦截器,确保未登陆的用户不能进行任何操作。
然后就是一个简单的CRUD的功能!
正在学习中支持你啊~~
现在就是有一个问题没有搞明白,在我的userForm.jsp文件中没有编写任何table之类的HTML代码,为什么struts2会帮我生成一个table.
默认好象使用template\xhtml\*.ftl文件作为模板,就是说struts2 默认使用freemarker作为模板,可是如何才能不使用任何模板呢?
struts.xml 文件配置成上面这样,是可以去掉table标签的,但是很多功能可能就不能正常了,特别是标签内容的显示和校验回显可能需要自己使用ongl手动调用,具体不清楚。
从struts2的结构看似乎它推荐使用模板语言,而且默认为freemarker,当然可以自己更改为velocity,看来还要搞定freemarker或者velocity后,struts2才算学习的完整。
正在学习struts2,lz写得很详细,收了
看看了
啊 一 看到 配置 文件 就 晕了 ,也没人给写写 XML的 注释!
是我太懒了吧 ,嘿嘿!
是我太懒了吧 ,嘿嘿!
如果想要完整的配制参考http://struts./dtds/struts-2.0.dtd就可以了啊。
有些东西是自己发挥的,也不知道写的对不对,希望没有把大家引入歧途,另外有什么不正确的地方请批评指正。
先表示感谢一下,再慢慢看!
谢~你的文章....