struts2学习笔记——马士兵视频版

在文件当中

<constant name="struts.devMode" value="true" />是当该文件的mapping修改时,不用重启服务器,即可生效。devMode开发模式。

 

/********过滤器类的源代码在Struts2src/core/src/main/java当中,选中项目,右键properties*****/

 

建立jar文件对应的源码D:\tool\struts-2.3.4\struts-2.3.4\src\core\src\main\java文件夹。右击文件夹,properties。。。

Javadoc location

 

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

        <action name="myjsp" class=””>

            <result>

            /index.jsp

            </result>

        </action>

</package>

1Namespace决定了action的访问路径,默认为””,可以接收所有的action;这种情况下http://localhost:8080/项目名/sadoxyz/jsdaufo/salfh/index.action也是可以的;其负责处理其他action处理不了的action

也可以写为”/”,或者”/xxx”/xxx/yyy,相应的action访问路径为/index.action/xxx/index.action/xxx/yyy/index.action

Namespace最好用模块来命名。即actionnamenamespace是一样的。

2struts.xml里面的package是用来防止action重名的,和java里的package作用一样。

<result name=”success”>/Hello.jsp</result>里面的result默认为success,可以不写。

3、注意拷贝一个项目的时候,要更改一个东西,右键propertiesmyeclipseweb,将Web Context-root的名字改成和新项目的名字一样,如“/test”。

4、引入其他项目,右键importGeneral,Existing Projects into Workspace,选择next,select root directory中选择项目,记住要选择copy projects into workspaceOk.

  注意jre可能出现问题,重新部署。

5、具体试图的返回可以根据用户自己定义的Action来决定。通过返回的字符串找到对应的配置项,来决定视图的内容;

具体的Action的实现可以是一个普通的java类,里面有public String execute(),或者实现Action接口,不过开发过程当中,最常用的是继承ActionSupport类,好处是可以直接使用struts2封装好的方法。

6、路径问题:

Struts2中是根据action的路径而不是jsp的路径来确定,所以,如果指定了相对位置,可能会报错,尽量都使用绝对位置,可以用下面的代码来获取绝对路径的前面部分:

<%String path = request.getContextPath();

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

%>(该部分放到头文件中)

在使用时,可以写成:

<a href=”<%=basePath%>index.jsp”> index.jsp</a>

或者:在head部分加上标签<base href="<%=basePath%>"/>,则<a href=”index.jsp”> index.jsp</a>直接就可以用。

这两种方法都需要将上面2句话放在头文件里。

注意:虽然可以用redirect方式解决,但是redirect方式并非必要。

7DMI(动态方法调用)

AddMethod.java中没有execute(),只有public String Add() {              return SUCCESS;      },可以在struts.xml中,改成:

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

                   <action name="user" class="example.AddMethod">

                            <result>/example/AddMethod.jsp</result>

                   </action>

</package>

浏览器中输入http://localhost:8080/test1/user/user!Add可调用该方法。

8、方法调用:

同样是调用该方法,可以使用

<action name="userAdd" class="org.hualang.actionmethod.ActionMethod" method="add"> 

            <result>/MyJsp.jsp</result>

</action>

来使用,浏览器中输入http://localhost:8080/test1/user/userAdd即可。

9、通配符的使用:

记住:约定优于配置。

系统匹配最精确匹配的action;包含*的属于同一等级,系统按照先后顺序。

<action name="*_*" class="cn.itcast.struts2. example.{1}Method" method="{2}">

 <result>/example/{1}_Method.jsp</param>

  </result>

</action>

假设调用的是Add_Method.javaAdd_Method.jsp页面。

10、用Action的属性接受参数:

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

a.定义:在Action类中定义属性,创建getset方法;

    b.接收:通过属性接收参数,如:name struts2中是通过方法来获取参数。

c.发送:使用属性名传递参数,如:user!add?name=aaa

UserAction.java

package com.zby.struts2.user.action;

import com.opensymphony.xwork2.ActionSupport;

 

public class UserAction extends ActionSupport{

//定义了两个属性nameage,使用getset两个方法来设置和获得属性值

private String name;

private int age;

public String add(){

System.out.println("name="+name);

System.out.println("age="+age);

return SUCCESS;

 

}

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;

}

}

 

struts.xml:

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="true" />

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

         <action name="user" class="com.zby.struts2.user.action.UserAction">

            <result>/user_add_success.jsp</result>

        </action>

    </package>

11、用Domain Model接收参数:(最常用)

<a href="user/user!add?user.name=a&user.age=8">

OR http://localhost:8080/test1/user/user!add?user.name=a&user.age=8

在这里我们可以直接使用  user对象+.+属性名 进行传值。其他的工作struts都会帮助我们完成的。Struts首先会new一个Action对象,然后new一个User对象user,我们在Action中只是声明了此对象,struts会自动帮我们赋值的。然后会调用对应的userset方法,并且将值赋给它们。这样我们就可以使用了。

Action类:

public class UserAction extends ActionSupport { 

 

    private User user; 

 

    public String add() { 

        System.out.println("name=" + user.getName()); 

        System.out.println("age=" + user.getAge()); 

        return SUCCESS; 

    } 

 

    public User getUser() { 

        return user; 

    } 

 

    public void setUser(User user) { 

        this.user = user; 

    } 

 

 

这里使用到了User类:(其实就是一个javabean

public class User { 

    private String name; 

    private int age; 

    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; 

    } 

12、用ModelDriven接收参数:

a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),通过getModel方法返回该对象;

    b.接收:通过对象的属性接收参数,如:user.getUserName()

c.发送:直接使用属性名传递参数,如:user2!add?userName=MGC

http://localhost:8080/test1/user/user1!add?name=a&age=8

Action.java:

public class UserAction1 extends ActionSupport implements ModelDriven<User>{

         private User user=new User();

         public String add(){

                   System.out.println("name:"+user.getName());

                    System.out.println("age:"+user.getAge());

                    return SUCCESS;

         }

         @Override

         public User getModel() {

                   return user;

         }

}

13、解决中文乱码问题:

struts.xml头文件中加入  <constant name="struts.i18n.encoding" value="GBK" />这条语句。

Struts2.1.7以前的不行,这个是bug。可以将filter改成2.0版本的修正这个bug,或者用springfilter来修改这个bug

14struts.xml头文件中的常量可以在struts_default.properties里面查看。

15、简单数据验证:

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

浏览器中输入:http://localhost:8080/test1/user/user2!add?name=a

(1)struts.xml中添加语句:

<action name="user2" class="example.UserAction2">

                            <result>/example/UserAction.jsp</result>

                            <result name="error">/example/UserAddError.jsp</result>

                   </action>

(2) UserAction2.java中:

public String add() {

                   if (name == null || !name.equals("admin")) {

                            this.addFieldError("name", "name is error");

                            this.addFieldError("name", "name is not good");           

       return ERROR;

                   }

                   return SUCCESS;

         }

 (3) UserAddError.jsp中重要语句:

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

  <body>

  <!-- 以固定的css样式取出错误信息,不方便我们进行相应的处理-->

<s:fielderror fieldName="name" theme="simple"/>

<!-- 从存储错误信息的Map中拿数据 -->

<s:property value="errors.name[0]"/>

<!-- 显示详细的栈信息-->

<s:debug></s:debug>

  </body>

16、通用标签:

(1)<s:property value=”abc” default=”name” escape=”true” />

value的值是Object属性,所以解析的时候会当成OGNL表达式来处理,会取参数,参数为null时取default里面的值;如果想在value里面就放一个string的话,需要写成” ’abc’ ”的形式。Escape默认为true,不解析value里面的html元素。

(2) set一般用来给给一些常用的长string赋个名字,方便使用。Var里面的值放到actionContext里面。

<li>set 设定adminName值(默认为request ActionContext: <s:set var="adminName" value="username" /></li>

<li>set request取值: <s:property value="#request.adminName" /></li>

<li>set ActionContext取值: <s:property value="#adminName" /></li>

Value的值是Object属性,struts2文档有问题。Idname已经废弃了,不需要用。

Set5个范围application, session, request, page, or action.默认为action

<%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li>

<li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %>

</li>--%>

<li>set 设定var,范围为ActionContext:

<s:set var="adminPassword" value="password"scope="session"/></li>

<li>set 使用#取值: <s:property value="#adminPassword"/> </li>

<li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>

这些结果可以相应的动手做实验得到结论。

(3)<s:bean name=”com.tc.Dog” var=”myDog”>

<s: param name=”name” value=”’lucy’”>

</s:bean>

bean的执行过程中,会new一个Dog类的对象,放到栈里面。Var是用来确定要不要放到actionContext里面的。

bean里面的name对应java文件,里面有name属性,这个是和param里面的name对应;var是参数名字,因为id属性已经废弃不用了;而var里面的value是可以将参数lucy传到bean里面的,不过,要加’ ’

如果要取值,有var的话,在actionContext里面也可以有, <s:property value="# myDog.name "/>

如果没有var的话,在bean里面写:

)<s:bean name=”com.tc.Dog” >

<s: param name=”name” value=”’lucy’”>

<s:property value=”name "/>

</s:bean>

(4)<s:include value=”/index.html”/>包含静态文件(容易在中文时出现问题)

使用%号:

<s:set var=”incPage” value=”’/index.html’”/>

<s:include value=”%{#incPage}”/>

里面的%{}强制将里面的内容转换成OGNL表达式,这个是通用的。

(5) $ # %的区别

a) $用于i18nstruts配置文件

b) #取得ActionContext的值

c) %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用

你可能感兴趣的:(struts2学习笔记——马士兵视频版)