马士兵struts2.1.6视频教程笔记

1、02_尚学堂马士兵_Struts2_Struts2_HelloWorld_2.avi   
  指定Tomcat的目录,指定JDK搭建开发环境(拷贝jar包,复制struts.xml文件 此文件不要放在WEB-INF下面,应该放到src下面  ),在web.xml文件中:   
<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>   
 其中<url-pattern>/*</url-pattern> 不要写/*.do 或者 /*.action约定俗成用/*   
  
  
2、04_尚学堂马士兵_Struts2_Struts2_HelloWorld_3.avi   
(1)   
<!-- <constant >:常量的配置 -->   
<!--name="struts.devMode" value="true":当前是开发模式,改动配置文件会自动装载 默认是false-->   
<!--命名空间 ---> action -->相应的处理类或页面 -->   
<constant name="struts.devMode" value="true" />   
     <package name="default" namespace="/" extends="struts-default">   
           
        <action name="hell" class="package + class xxxx">   
            <result>   
                /Hello.jsp   
            </result>   
        </action>   
    </package>   
  
(2)struts.xml不自动提示的解决办法: window--perferences-XML catalog---add---key Type="URI"  key="*.dtd"  
  
  
3、09_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_2.avi   
   struts2的执行流程:   
   当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给那个WebApplication来处理,然后会读取它下面的web.xml配置发现有配置:   
<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>因为<url-pattern> 为/* 它会过滤所有的请求然后就交给filter类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter处理执行调用doFilter()方法,然后再方法中会读取struts-xml文件,根据用户请求的地址找到相应的package、 action、 result、然后将相应的页面返回给浏览器   
  
  
4、10_尚学堂马士兵_Struts2_Struts2_Namespace_命名空间.avi   
(1)namespace决定了action的访问路径,默认为"",可以接收所有路径的action   
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,   
/xxx/index.action,或者/xxx/yyy/index.action   
namespace最好也用模块来进行命名   
  
  
5、11_尚学堂马士兵_Struts2_Struts2_Action.avi   
(1)struts1 与struts2的一个重要区别:在struts1中进行多次访问的时候用到的是同一个Action对象。而struts2则是每一次访问都会创建一个Action对象,所以struts2不会有线程安全问题的发生   
(2)<result>标签如果没有指定name属性默认返回值为success   
 (3)<action>标签中的class值如果没有配置相应的类,它会调用struts默认的一个处理类的execute()方法.   
(4)实现struts的处理类的时候不要自己随便写类然后定义execute()方法,也不要实现Action类而要从ActionSupport类继承,可以直接使用它为我们定义好的方法.   
  
  
6、12_尚学堂马士兵_Struts2_Struts2_Path_路径问题.avi   
(1)struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。   
虽然可以用redirect方式解决,但redirect方式并非必要。   
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)   
或者使用myeclipse经常用的,指定basePath   
(2)request.getContextPath()得到项目的名字,一般用来解决路径问题 如果项目为根目录,则得到一个"",即空的字条串。   
     request.getscheme()返回的协议名称.默认是http    
    request.getServerName()就是获取你的网站的域名,如果是在本地的话就是localhost    
    request.getServerPort()获取服务的端口号      
  
  
7、13_尚学堂马士兵_Struts2_Struts2_ActionMethod_DMI_动态方法调用.avi   
   Action执行的时候并不一定要执行execute方法<br />   
可以在配置文件中配置Action的时候用method=来指定执行哪个方法   
也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br />   
    <a href="<%=context %>/user/userAdd">添加用户</a>   
    <br />   
    <a href="<%=context %>/user/user!add">添加用户</a>   
    <br />   
前者会产生太多的action,所以不推荐使用   
配置文件:   
<package name="user" extends="struts-default" namespace="/user">   
        <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">   
            <result>/user_add_success.jsp</result>   
        </action>   
           
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">   
            <result>/user_add_success.jsp</result>   
        </action>   
    </package>   
  
  
8、14_尚学堂马士兵_Struts2_Struts2_ActionWildcard_通配符配置.avi   
   主要学习通配符的使用  通配符可以将配置量降到最低,不过一定要遵守"约定优于配置"的原则   
<package name="actions" extends="struts-default" namespace="/actions">   
    <action name="Student_add"></action>   
    <action name="Student_*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">   
 <result>/Student_{1}_success.jsp</result>   
    </action>   
    <!-- 更简便的配置法 -->   
    <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">   
 <result>/{1}_{2}_success.jsp</result>   
    </action>   
</package>   
说明:   
(1){1}代表name="Student*"后面第一个'*',同理{2}代表第二个'*'  
(2).如果action之间有重复配置,struts2会匹配最精确的action。如果通配符配置之间有重复,则看前后配置顺序   
  
  
9、 15_尚学堂马士兵_Struts2_Struts2_用Action的属性接收参数.avi    
     在继承ActionSupport的类中定义要接受的参数,参数的名称与Action所传的名称无关在struts2内部调用的是属性的set方法,所以setxxx()的名字一定要与Action后面所传的值是一样的。   
  
  
10、16_尚学堂马士兵_Struts2_Struts2_用DomainModel接收参数.avi   
    如果要接受的参数的个数很多,我们可以不用定义属性而是直接定义一个对象例如:   
     private User user (set get 方法)在调用Action传值的时候使用user!add?user.name=x&user.age=x的方式进行值得传递。(最常用的方式)   
  
  
11、17_尚学堂马士兵_Struts2_Struts2_用ModelDriven接收参数.avi   
    继承ActionSupport类的处理类必须同时实现ModelDriven<Object>(实现getModel())在传值的时候使用user/user!add?name=bbb进入处理类的时候会调用getModel()方法返回User对象并且把传过来的值set到里面,注意:此时private User user = new User() 不能只定义,要同时实现这样getModel()才能拿到user对象。   
  
  
12、18_尚学堂马士兵_Struts2_Struts2_2.1.6版本的中文问题.avi   
    在配置文件中加入:   
     <constant name="struts.i18n.encoding" value="GBK"/> 按照文档说明加入此句可解决中文乱码但是不行这是2.1.6的一个bug,会在下一个版本中修复 如何解决呢:在web.xml中:    
<filter-name>struts2</filter-name>   
        <!--<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>-->   
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>   
把过滤器的版本改成老版本的即可解决该问题!   
  
  
13、19_尚学堂马士兵_Struts2_简单数据验证_1.avi   
    使用addFieldError方法和s:fieldError标签简单处理数据校验   
     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;   
    }   
在页面中显示错误信息:   
<!-- 以固定的css样式取出错误信息,不方便我们进行相应的处理-->   
<s:fielderror fieldName="name" theme="simple"/>   
<!-- 从存储错误信息的Map中拿数据 -->   
<s:property value="errors.name[1]"/>   
<!-- 显示详细的栈信息-->   
<s:debug></s:debug>   
  
  
14、21_尚学堂马士兵_Struts2_访问Web元素_1.avi   
注意:web.xml中关于struts的配置一定要采用2.1的,2.0的会取不到这是一个bug   
(1)通过ActionContext对象取得Map类型的request, session, application HttpServletRequest, HttpSerletSession ServletContetext:   
  public class LoginAction1 extends ActionSupport {   
       
    private Map request;   
    private Map session;   
    private Map application;   
       
         //访问此方法,取得相应的对象但是是Map类型   
    public LoginAction1() {   
      request = (Map)ActionContext.getContext().get("request");   
      session = ActionContext.getContext().getSession();   
      application = ActionContext.getContext().getApplication();   
    }   
    //在Map类型的对象中存入相应的值   
    public String execute() {   
        request.put("r1", "r1");   
        session.put("s1", "s1");   
        application.put("a1", "a1");   
        return SUCCESS;    
    }      
}   
//在页面中通过标签取得存入的数据 二种方法(通过标签, 通过原始方式):   
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />   
    <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />   
    <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />   
    <s:property value="#attr.a1"/><br />   
    <s:property value="#attr.s1"/><br />   
    <s:property value="#attr.r1"/><br />   
    <s:debug></s:debug>   
    <br />   
我们存入Map中的数据居然可以在request,等对象中得到,那么在struts内部他是将Map中的数据全部复制到了request,session等对象中的 #attr ,可以取得所有的属性,但是不推荐使用,为了防止同名的情况,造成无法区别。   
(2)通过实现RequestAware,SessionAware, ApplicationAware 接口获取(最常用 和重要的一种)   
private Map<String, Object> request;   
    private Map<String, Object> session;   
    private Map<String, Object> application;   
       
    //DI dependency injection   
    //IoC inverse of control   
    public String execute() {   
        request.put("r1", "r1");   
        session.put("s1", "s1");   
        application.put("a1", "a1");   
        return SUCCESS;    
    }   
  
    @Override  
    public void setRequest(Map<String, Object> request) {   
        this.request = request;   
           
    }   
  
    @Override  
    public void setSession(Map<String, Object> session) {   
        this.session = session;   
           
    }   
  
    @Override  
    public void setApplication(Map<String, Object> application) {   
        this.application = application;   
           
    }   
(3)通过ServletActionContext()取得真实的相应的对象   
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", "r1");   
        session.setAttribute("s1", "s1");   
        application.setAttribute("a1", "a1");   
        return SUCCESS;    
    }   
(4)通过实现ServletRequestAware接口获得相应的对象   
  private HttpServletRequest request;   
    private HttpSession session;   
    private ServletContext application;   
       
       
       
    public String execute() {   
        request.setAttribute("r1", "r1");   
        session.setAttribute("s1", "s1");   
        application.setAttribute("a1", "a1");   
        return SUCCESS;    
    }   
  
  
  
    @Override  
    public void setServletRequest(HttpServletRequest request) {   
        this.request = request;   
        this.session = request.getSession();   
        this.application = session.getServletContext();   
    } 

15、23_尚学堂马士兵_Struts2_模块包含   
<struts>   
    <constant name="struts.devMode" value="true" />   
    <include file="login.xml" />   
</struts>   
可以将别的写好的配置文件直接包含到struts得配置文件中,方便多人开发避免不必要的配置文件冲突.   
login.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>   
    <package name="login" extends="struts-default" namespace="/login">   
        <action name="login*" class="com.bjsxt.struts2.user.action.LoginAction{1}">   
            <result>/user_login_success.jsp</result>   
        </action>   
    </package>   
</struts>   
  
16、24_尚学堂马士兵_Struts2_默认Action   
<package name="default" namespace="/" extends="struts-default">   
         <!-- 当配置文件中没有用户要访问的Aciton的时候,会调用<default-action-ref 所定义的Action --处理错误页面 -->   
        <default-action-ref name="index"></default-action-ref>   
        <action name="index">   
            <result>/default.jsp</result>   
        </action>   
    </package>   
  
17、27_尚学堂马士兵_Struts2_结果类型_result_type_1   
    ResultType的最常用的几种配置:(四种配置分别代表了四种不同的跳转方式)   
     <package name="resultTypes" namespace="/r" extends="struts-default">   
        <action name="r1">   
                  <!--type不写默认的为dispatcher:用服务器跳转跳转到结果页面--只能跳转到页面,不能跳转到Action -->   
            <result type="dispatcher">/r1.jsp</result>   
        </action>   
           
        <action name="r2">   
                  <!--客户端跳转的方式跳转到结果页面  只能跳转到页面,不能跳转到Action  -->   
            <result type="redirect">/r2.jsp</result>   
        </action>   
           
        <action name="r3">   
                  <!--服务器跳转的方式跳转到Action -->   
            <result type="chain">r1</result>   
        </action>   
           
        <action name="r4">   
                  <!--客户端跳转的方式跳转到Action -->   
            <result type="redirectAction">r2</result>   
        </action>   
<!--当要跳转的Action在别的包下的时候 应该这样写-->   
              <action name="r5">   
               <result type="china">   
                   <parma name="actionName">dashboard</param>   
                   <parma name="namespace">/sesure</param>   
               </result>   
        </action>   
  
18、30_尚学堂马士兵_Struts2_Global_Results_全局结果集   
 <package name="user" namespace="/user" extends="struts-default">   
 <!-- 配置全局的结果集:当返回的result没有配置的时候会执行全局结果集的配置-->   
        <global-results>   
            <result name="mainpage">/main.jsp</result>   
        </global-results>   
           
        <action name="index">   
            <result>/index.jsp</result>   
        </action>     
    </package>   
<!--关键字extends的使用:我想在下面的这个配置包中使用上面那个包中的结果集,那么可以使用extends关键字继承上一个包   
<package name="admin" namespace="/admin" extends="user">   
        <action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">   
            <result>/admin.jsp</result>   
        </action>   
    </package>   
  
17、31_尚学堂马士兵_Struts2_动态结果集_dynamic_result   
可以在strtus.xml文件中动态的指定返回的结果集。   
public class UserAction extends ActionSupport {   
    private int type;   
       
    private String r;   
  
    public String getR() {   
        return r;   
    }   
  
    public void setR(String r) {   
        this.r = r;   
    }   
  
    public int getType() {   
        return type;   
    }   
  
    public void setType(int type) {   
        this.type = type;   
    }   
  
    @Override  
    public String execute() throws Exception {   
        if(type == 1) r="/user_success.jsp";   
        else if (type == 2) r="/user_error.jsp";   
        return "success";   
    }   
}   
struts.xml文件中的配置:   
<package name="user" namespace="/user" extends="struts-default">   
           
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">   
<!--可以用${属性名}的方式取得Action中的属性,在服务器端判断好相应的跳转路径然后存到变量里 然后再struts.xml文件中用这种方式取出来,可以极大的增加配置文件的灵活性 -->   
            <result>${r}</result>   
        </action>        
    </package>   
  
  
18、32_尚学堂马士兵_Struts2_带参数的结果集   
访问链接格式:<a href="user/user?type=1">传参数</a>   
public class UserAction extends ActionSupport {   
    private int type;   
       
    public int getType() {   
        return type;   
    }   
  
    public void setType(int type) {   
        this.type = type;   
    }   
  
    @Override  
    public String execute() throws Exception {   
        return "success";   
    }   
  
}   
     当从一个Action跳转到另一个Action的时候,如果需要传值并且是服务器端的跳转,没有必要再struts.xml文件result的跳转路径中进行传值操作,因为多个服务器端的跳转,共享的是同一个值栈,可以直接取到,但是如果是客户端的跳转(redirect)的方式进行跳转则需要进行如下的配置:   
 <package name="user" namespace="/user" extends="struts-default">   
        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">   
                  <!-- 用${}的方式是从值栈取值,注意:不是El表达式 -->   
            <result type="redirect">/user_success.jsp?t=${type}</result>   
        </action>        
    </package>   
但是如果在jsp页面取出传输的值用<s:property value="t"/>是取不到的,因为这种方式是在值栈里取值而我们跳转道德是一个jsp页面不是一个Action所以值栈为空,但是我们可以在ActionContext中进行取值:<s:property value="#parameters.t"/>  

 
19、36_尚学堂马士兵_Struts2_OGNL_1   
在访问Actoin向Action进行传值的时候   
http: www.xxxxx/ognl.action?username=u&password=p;   
private String username(set get 方法)   
private String password(set get 方法)   
如果用这种方式进行传值,那么在jsp页面中可以用<s:property value="username"/>进行访问值栈中的内容,没有任何问题    但是如果:   
http:www.xxxxx/ognl.action?username=u&password=p;   
private User user;(set get)方法,使用<s:property value="user"/>依然访问不到,因为如果采用dominModel的方式进行传值,必须:http:www.xxxxx/ognl.action?user.username=u&user.password=p;这样 Struts会在Action中帮助我们new一个User对象,然后把值放进去,但是必须要有User空的构造方法。如果依然使用http:www.xxxxx/ognl.action?username=u&password=p;的方式进行传值,那么在Action中必须手动的初始化User对象,Private User user = new User();这样同样可以访问的到。   
  
  
20、37_尚学堂马士兵_Struts2_OGNL_2   
    Ognl:Object graph Navigation Language(对象图导航语言):首先看一下下面三个类之间的关系:   
     public class OgnlAsction extends ActionSupport {   
       private Cat cat;(set get 方法)   
       public String m() {   
         return "你好";   
       }   
     }   
        
     public class Cat {   
        private Dog friend;(set get 方法)   
     }   
  
      public Dog {   
        private String name;(set get 方法)   
      }   
在OgnlAction中包含Cat,而在Cat中包含Dog的对象friend,那么现在我想访问OgnlAction的时候,给friend肤质,我们应该这么写:   
http:www.xxxx/ognl.action?cat.friend.name=aaa;   用点进行导航,所以叫做"对象图导航语言"。   
  
21、39_尚学堂马士兵_Struts2_OGNL_4   
    已知以下三个类中的属性和方法:   
     public class OgnlAsction extends ActionSupport {   
       private Cat cat;(set get 方法)       
       private String password;(set get 方法)   
       List<User> users = new ArrayList<User>();(set get 方法)   
     }   
        
     public class Cat {   
       private Dog friend;(set get 方法)   
        private String miaomiao() {   
         return "miaomiao";   
       }    
     }   
  
     public Dog {   
        private String name;(set get 方法)   
     }   
       
     public class S {   
    public static String STR = "STATIC STRING";   
       
    public static String s() {   
        return "static method";   
    }   
     }   
        
     (1)访问值栈中对象的普通方法:<s:property value="password.length()"/>   
     (2)访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" />   
     (3)访问值栈中的Action的普通属性<s:property value="username"/>   
     (4)访问值栈中对象的普通属性<s:property value="user.age" />   
     (5)访问值栈中对象的普通属性<s:property value="cat.friend.name" />   
     (6)访问值栈中Action的普通方法<s:property value="m()" />   
<!--要想访问静态方法,必须在struts.xml文件中加入如下配置才可以 -->   
<constant name="struts.ognl.allowStaticMethodAccess"value="true"/>        
     (7)访问静态方法<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>   
     (8)访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>   
     (9)访问Math类的静态方法:<s:property value="@@max(2,3)" />(不常用)   
     (10)访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User()"  
     (11)访问List:<s:property value="users"/>   
     (12)访问List中某个元素:<s:property value="users[1]"/>   
<!-- 把users中的每一个元素User取出来,然后取他们的age属性连接成的字符串-->   
     (13)访问List中元素某个属性的集合:<s:property value="users.{age}"/>   
     (14)访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/>   
     (15)访问Set:<s:property value="dogs"/>   
<!--下面这样访问set中的某个元素是访问不到的,因为set是没有顺序的 -->   
     (16)访问Set中某个元素:<s:property value="dogs[1]"/>   
     (17)访问Map:<s:property value="dogMap"/>   
     (18)访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/>   
     (19)访问Map中所有的key:<s:property value="dogMap.keys"/>   
     (20)访问Map中所有的value:<s:property value="dogMap.values"/>   
<!--在ognl中他会把size方法看成属性,所以可以不加括号,直接访问 -->   
     (21)访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/>   
<!-- ?#指的是过滤:取出users中的每个age==1的元素 [0]是取第一个,不加 会全部取出来   
     (22)投影(过滤):<s:property value="users.{?#this.age==1}[0]"/>   
<!-- ^#:开头 取出满足条件的开头的那一个 -->   
     (23)投影:<s:property value="users.{^#this.age>1}.{age}"/>   
<!-- $#:开头 取出满足条件的结尾的那一个 -->   
     (24)投影:<s:property value="users.{$#this.age>1}.{age}"/>   
<!-- 判断 -->   
     (25)投影:<s:property value="users.{$#this.age>1}.{age} == null"/>   
     (24)投影:<s:property value="users.{$#this.age>1}.{age}"/>   
<!-- value="[1]访问值栈中从上到下的第几个元素,而[0]指的是值栈中从开始到结尾的所有的对象,得到的是一个集合" [0].username:访问值栈中所有元素的username属性,如果没有此属性会依次往下找其他的Action(从一个action跳转到另一个action的时候 值栈中会有两个action) -->   
     (25)[]:<s:property value="[0].username"/>   
  
22、44_尚学堂马士兵_Struts2_Struts标签_1   
    (1)property: <s:property value="username"/>   
    (2)property 取值为字符串: <s:property value="'username'"/>   
<!-- 如果取到admin的值,就是admin的值否则就是default所定义的默认值 -->   
    (3)property 设定默认值: <s:property value="admin" default="管理员"/>   
<!-- value可以直接写html标签,escape默认为true,会原样不变显示出来,false将把html标签转化为浏览器可以识别的标签,显示相应的效果 -->   
    (4)property 设定HTML: <s:property value="'<hr/>'" escape="false"/> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值