Struts2学习 Action

来源:互联网 发布:房屋平面图绘制软件 编辑:程序博客网 时间:2024/05/22 00:22

设置Tomcat:

window->Preferences->MyEclipse->Servers->Tomcat->Tomcat6.x

然后选择tomcat home directory ->enable-> finish

 

设置JDK:

 window-->Preferences->Java->Installed JRE

如果没有对应的JDK(不是JRE),选择add->standard VM -> next->选择JDK对应的Directory->将刚刚设定的JDK设为默认

 

查看jar包源码:

右击jar文件->Properties->Java Source Attachment->External Folder->D:/share/tools/struts-2.1.6/src/core/src/main/java

 

加入javadoc文档:

右击jar文件->Properties->Javadoc Location->Browse

 

1.建立第一个struts2的程序

a)         找到struts目录下对应的apps目录

b)         解压struts2-blank-2.1.6.war

c)         Copy对应的libjar文件,需要除junitspring-test之外的所有文件,其中commons-iojar包会在文件上传和下载时需要,其他为必须

d)         Copy对应的struts.xmlsrc目录,在package explorer视图进行操作

e)         注释掉struts.xml的多余内容

f)          建立HelloStruts2_1.jsp文件

h)         struts.xml中照原配置进行对应的配置

i)           修改对应的web.xml,建立struts2filter,添加代码如下:


 

 

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


 

注:①修改jsp文件的默认编码属性window-preferences-web-jspfiles-设为Chinese,National Standard

      ②建立strutsdev-mode,好处在于我们修改了配置文件的时候能够自动热替换

         在struts.xml中的<package></package>前加入

 

     ③认识Action的后缀名,在struts2默认中,带不带action都可以

 


<constant name="struts.devMode" value="true" />

 


 

2.Namespace

namespace决定了action的访问路径,默认为"",可以接收所有路径的action。namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,/xxx/index.action,或者/xxx/yyy/index.action。

注:namespace最好也用模块来进行命名。

 

 

3.Action Introduction

具体视图的返回可以由用户自己定义的Action来决定,具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容。

具体Action的实现可以是一个普通的java类,里面有public String execute方法即可,或者实现Action接口,不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法。

 

从ActionSupport继承实现Action(最常用):


import com.opensymphony.xwork2.ActionSupport;

public class IndexAction extends ActionSupport {
 public String execute()
 {
  return "success";
 }
}

 


 

 

 

 

4.path

struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。

虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath 

 


指定basePath:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

 


 

 

5.Action Method

Action执行的时候并不一定要执行execute方法,可以在配置文件中配置Action的时候用method=来指定执行哪个方法,也可以在url地址中动态指定(动态方法调用DMI)(推荐) 


<% String context = request.getContextPath(); %>

<a href="<%=context %>/user/userAdd">添加用户</a>
<a href="<%=context %>/user/user!add">添加用户</a>


前者会产生太多的action,所以不推荐使用

 

 

 

6.Action Wildcard(通配符)

 使用通配符,将配置量降到最低。不过,一定要遵守"约定优于配置"的原则。

 


 

        <action name="*_*" class="com.struts.wildcard.{1}Action" method="{2}">
            <result >
               /{1}_{2}_success.jsp
            </result>
        </action>


{1}对应前面的第一个'*',{2}对应前面的第二个'*',例如要调用Student_add_success.jsp则可以创建连接如下:

 

<a href="actions/Studentadd">添加学生</a>

 

 

 

 

 

7.接收参数的方法(一般用属性或者DomainModel来接收)

 

①使用Domain Model接收参数

(需要创建两个类:一个action类,一个model类,不在action类中new一个model类对象,而是对model类直接用set/get方法)

 

 


 

    <a href="user/user!add?user.name=a&user.passwd=p">添加用户</a>

 

 

 


 

 

②使用action属性接收参数

 


 

    <a href="user/user!add?name=a&age=9">添加用户</a>

 


 

 

③ 使用ModelDriven接收参数(需要创建两个类:一个action类,一个model类,并在action中new一个model类对象)

 


 

    <a href="user/user!add?name=a&age=8"> 添加用户</a>

 


 

 

 

 

8.简单参数验证addFieldError

 

 

使用addFieldError方法和s:fieldError标签简单处理数据校验

 


 

User Add Error!
 <s:fielderror fieldName="name" theme="simple"/>
 <br />
 <s:property value="errors.name[0]"/>
 <s:debug></s:debug>

 


 

其中, fieldName值和action中的addFieldError方法中传的一致,property value显示值,值可以在<s:debug></s:debug>中查到。

 

 

Action中的add方法如下: 


 

public String add()
 {
  if(name==null||!name.equals("admin"))
  {
   this.addFieldError("name", "name is error");
   this.addFieldError("name", "name is too long");
   return ERROR;
  }
  return SUCCESS;
 }

 


 

 

 

 

9.访问Web元素

a)         Map类型

                         i.              IoC(推荐使用)


package com.struts2.user.action;

 

import java.util.Map;

import org.apache.struts2.interceptor.ApplicationAware;

import org.apache.struts2.interceptor.RequestAware;

import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionSupport;

 

public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
 
 private Map<String,Object> request;
 private Map<String,Object> session;
 private Map<String,Object> application;
 
 public String execute(){
  request.put("r1", "r2");
  session.put("s1", "s2");
  application.put("a1", "a2");
  return SUCCESS;
 }

 

                      public void setRequest(Map<String, Object> arg0) {
  // TODO Auto-generated method stub

                        this.request=arg0;
 }

                      public void setSession(Map<String, Object> arg0) {
  // TODO Auto-generated method stub

                       this.session=arg0;
 }

                      public void setApplication(Map<String, Object> arg0) {
  // TODO Auto-generated method stub

                       this.application=arg0;
 }

}


 

 

                       ii.              依赖Struts2


import java.util.Map;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

 

public class LoginAction1 extends ActionSupport {

 

                      private Map request;
 private Map session;
 private Map application;
 
 public LoginAction1()
 {
  request=(Map)ActionContext.getContext().get("request");
  session=ActionContext.getContext().getSession();
  application=ActionContext.getContext().getApplication();
 }
 
 public String execute()
 {
  request.put("r1", "r1");
  session.put("s1", "s1");
  application.put("a1", "a1");
  return SUCCESS;
 }

}

 


 

b)         原始类型

                         i.              IoC


package com.struts2.user.action;

 

import javax.servlet.ServletContext;

import javax.servlet.http.*;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

 

public class LoginAction3 extends ActionSupport {

                      private HttpServletRequest request;
 private HttpSession session;
 private ServletContext application;
 
 public LoginAction3()
 {
  request=ServletActionContext.getRequest();
  session=request.getSession();
  application=session.getServletContext();
 }
 
 public String execute()
 {
  request.setAttribute("r1", "r3");
  session.setAttribute("s1", "s3");
  application.setAttribute("a1", "a3");
  return SUCCESS;
 }
 

}

 


 

                       ii.              依赖Struts2


package com.struts2.user.action;

 

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

 

public class LoginAction4 extends ActionSupport implements ServletRequestAware {

 

 private HttpServletRequest request;
 private HttpSession session;
 private ServletContext application;
 
 public String execute()
 {
  request.setAttribute("r1", "r4");
  session.setAttribute("s1", "s4");
  application.setAttribute("a1", "a4");
  return SUCCESS;
 }
 
 public void setServletRequest(HttpServletRequest arg0) {
  // TODO Auto-generated method stub

  request=arg0;
  this.session=request.getSession();
  this.application=session.getServletContext();
 }

}


 

 

 

 

10.包含文件配置


<?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" />
 <include file="login.xml" />

 
</struts>


 

 

11.默认action处理

 <default-action-ref name="index"></default-action-ref>

原创粉丝点击