马士兵strusts笔记解析

来源:互联网 发布:史蒂芬周 mac 编辑:程序博客网 时间:2024/06/15 21:27
  1. 1、02_尚学堂马士兵_Struts2_Struts2_HelloWorld_2.avi  
  2.   指定Tomcat的目录,指定JDK搭建开发环境(拷贝jar包,复制struts.xml文件 此文件不要放在WEB-INF下面,应该放到src下面  ),在web.xml文件中:  
  3. <filter>  
  4.         <filter-name>struts2</filter-name>  
  5.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  6.     </filter>  
  7.   
  8.     <filter-mapping>  
  9.         <filter-name>struts2</filter-name>  
  10.         <url-pattern>/*</url-pattern>  
  11.     </filter-mapping>  
  12.  其中<url-pattern>/*</url-pattern> 不要写/*.do 或者 /*.action约定俗成用/*  
  13.   
  14.   
  15. 2、04_尚学堂马士兵_Struts2_Struts2_HelloWorld_3.avi  
  16. (1)  
  17. <!-- <constant >:常量的配置 -->  
  18. <!--name="struts.devMode" value="true":当前是开发模式,改动配置文件会自动装载 默认是false-->  
  19. <!--命名空间 ---> action -->相应的处理类或页面 -->  
  20. <constant name="struts.devMode" value="true" />  
  21.      <package name="default" namespace="/" extends="struts-default">  
  22.           
  23.         <action name="hell" class="package + class xxxx">  
  24.             <result>  
  25.                 /Hello.jsp  
  26.             </result>  
  27.         </action>  
  28.     </package>  
  29.   
  30. (2)struts.xml不自动提示的解决办法: window--perferences-XML catalog---add---key Type="URI"  key="*.dtd"  
  31.   
  32.   
  33. 3、09_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_2.avi  
  34.    struts2的执行流程:  
  35.    当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给那个WebApplication来处理,然后会读取它下面的web.xml配置发现有配置:  
  36. <filter>  
  37.         <filter-name>struts2</filter-name>  
  38.         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>  
  39.     </filter>  
  40.   
  41.     <filter-mapping>  
  42.         <filter-name>struts2</filter-name>  
  43.         <url-pattern>/*</url-pattern>  
  44.     </filter-mapping>因为<url-pattern> 为/* 它会过滤所有的请求然后就交给filter类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter处理执行调用doFilter()方法,然后再方法中会读取struts-xml文件,根据用户请求的地址找到相应的package、 action、 result、然后将相应的页面返回给浏览器  
  45.   
  46.   
  47. 4、10_尚学堂马士兵_Struts2_Struts2_Namespace_命名空间.avi  
  48. 1)namespace决定了action的访问路径,默认为"",可以接收所有路径的action  
  49. namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,  
  50. /xxx/index.action,或者/xxx/yyy/index.action  
  51. namespace最好也用模块来进行命名  
  52.   
  53.   
  54. 5、11_尚学堂马士兵_Struts2_Struts2_Action.avi  
  55. 1)struts1 与struts2的一个重要区别:在struts1中进行多次访问的时候用到的是同一个Action对象。而struts2则是每一次访问都会创建一个Action对象,所以struts2不会有线程安全问题的发生  
  56. 2)<result>标签如果没有指定name属性默认返回值为success  
  57.  (3)<action>标签中的class值如果没有配置相应的类,它会调用struts默认的一个处理类的execute()方法.  
  58. (4)实现struts的处理类的时候不要自己随便写类然后定义execute()方法,也不要实现Action类而要从ActionSupport类继承,可以直接使用它为我们定义好的方法.  
  59.   
  60.   
  61. 6、12_尚学堂马士兵_Struts2_Struts2_Path_路径问题.avi  
  62. 1)struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。  
  63. 虽然可以用redirect方式解决,但redirect方式并非必要。  
  64. 解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)  
  65. 或者使用myeclipse经常用的,指定basePath  
  66. 2)request.getContextPath()得到项目的名字,一般用来解决路径问题 如果项目为根目录,则得到一个"",即空的字条串。  
  67.      request.getscheme()返回的协议名称.默认是http   
  68.     request.getServerName()就是获取你的网站的域名,如果是在本地的话就是localhost   
  69.     request.getServerPort()获取服务的端口号     
  70.   
  71.   
  72. 7、13_尚学堂马士兵_Struts2_Struts2_ActionMethod_DMI_动态方法调用.avi  
  73.    Action执行的时候并不一定要执行execute方法<br />  
  74. 可以在配置文件中配置Action的时候用method=来指定执行哪个方法  
  75. 也可以在url地址中动态指定(动态方法调用DMI)(推荐)<br />  
  76.     <a href="<%=context %>/user/userAdd">添加用户</a>  
  77.     <br />  
  78.     <a href="<%=context %>/user/user!add">添加用户</a>  
  79.     <br />  
  80. 前者会产生太多的action,所以不推荐使用  
  81. 配置文件:  
  82. <package name="user" extends="struts-default" namespace="/user">  
  83.         <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">  
  84.             <result>/user_add_success.jsp</result>  
  85.         </action>  
  86.           
  87.         <action name="user" class="com.bjsxt.struts2.user.action.UserAction">  
  88.             <result>/user_add_success.jsp</result>  
  89.         </action>  
  90.     </package>  
  91.   
  92.   
  93. 8、14_尚学堂马士兵_Struts2_Struts2_ActionWildcard_通配符配置.avi  
  94.    主要学习通配符的使用  通配符可以将配置量降到最低,不过一定要遵守"约定优于配置"的原则  
  95. <package name="actions" extends="struts-default" namespace="/actions">  
  96.     <action name="Student_add"></action>  
  97.     <action name="Student_*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">  
  98.  <result>/Student_{1}_success.jsp</result>  
  99.     </action>  
  100.     <!-- 更简便的配置法 -->  
  101.     <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">  
  102.  <result>/{1}_{2}_success.jsp</result>  
  103.     </action>  
  104. </package>  
  105. 说明:  
  106. 1){1}代表name="Student*"后面第一个'*',同理{2}代表第二个'*'  
  107. 2).如果action之间有重复配置,struts2会匹配最精确的action。如果通配符配置之间有重复,则看前后配置顺序  
  108.   
  109.   
  110. 9、 15_尚学堂马士兵_Struts2_Struts2_用Action的属性接收参数.avi   
  111.      在继承ActionSupport的类中定义要接受的参数,参数的名称与Action所传的名称无关在struts2内部调用的是属性的set方法,所以setxxx()的名字一定要与Action后面所传的值是一样的。  
  112.   
  113.   
  114. 10、16_尚学堂马士兵_Struts2_Struts2_用DomainModel接收参数.avi  
  115.     如果要接受的参数的个数很多,我们可以不用定义属性而是直接定义一个对象例如:  
  116.      private User user (set get 方法)在调用Action传值的时候使用user!add?user.name=x&user.age=x的方式进行值得传递。(最常用的方式)  
  117.   
  118.   
  119. 11、17_尚学堂马士兵_Struts2_Struts2_用ModelDriven接收参数.avi  
  120.     继承ActionSupport类的处理类必须同时实现ModelDriven<Object>(实现getModel())在传值的时候使用user/user!add?name=bbb进入处理类的时候会调用getModel()方法返回User对象并且把传过来的值set到里面,注意:此时private User user = new User() 不能只定义,要同时实现这样getModel()才能拿到user对象。  
  121.   
  122.   
  123. 12、18_尚学堂马士兵_Struts2_Struts2_2.1.6版本的中文问题.avi  
  124.     在配置文件中加入:  
  125.      <constant name="struts.i18n.encoding" value="GBK"/> 按照文档说明加入此句可解决中文乱码但是不行这是2.1.6的一个bug,会在下一个版本中修复 如何解决呢:在web.xml中:   
  126. <filter-name>struts2</filter-name>  
  127.         <!--<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>-->  
  128.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  129. 把过滤器的版本改成老版本的即可解决该问题!  
  130.   
  131.   
  132. 13、19_尚学堂马士兵_Struts2_简单数据验证_1.avi  
  133.     使用addFieldError方法和s:fieldError标签简单处理数据校验  
  134.      public String add() {  
  135.         if(name == null || !name.equals("admin")) {  
  136.             this.addFieldError("name""name is error");  
  137.             this.addFieldError("name""name is too long");  
  138.             return ERROR;  
  139.         }   
  140.         return SUCCESS;  
  141.     }  
  142. 在页面中显示错误信息:  
  143. <!-- 以固定的css样式取出错误信息,不方便我们进行相应的处理-->  
  144. <s:fielderror fieldName="name" theme="simple"/>  
  145. <!-- 从存储错误信息的Map中拿数据 -->  
  146. <s:property value="errors.name[1]"/>  
  147. <!-- 显示详细的栈信息-->  
  148. <s:debug></s:debug>  
  149.   
  150.   
  151. 14、21_尚学堂马士兵_Struts2_访问Web元素_1.avi  
  152. 注意:web.xml中关于struts的配置一定要采用2.1的,2.0的会取不到这是一个bug  
  153. (1)通过ActionContext对象取得Map类型的request, session, application HttpServletRequest, HttpSerletSession ServletContetext:  
  154.   public class LoginAction1 extends ActionSupport {  
  155.       
  156.     private Map request;  
  157.     private Map session;  
  158.     private Map application;  
  159.       
  160.          //访问此方法,取得相应的对象但是是Map类型  
  161.     public LoginAction1() {  
  162.       request = (Map)ActionContext.getContext().get("request");  
  163.       session = ActionContext.getContext().getSession();  
  164.       application = ActionContext.getContext().getApplication();  
  165.     }  
  166.     //在Map类型的对象中存入相应的值  
  167.     public String execute() {  
  168.         request.put("r1""r1");  
  169.         session.put("s1""s1");  
  170.         application.put("a1""a1");  
  171.         return SUCCESS;   
  172.     }     
  173. }  
  174. //在页面中通过标签取得存入的数据 二种方法(通过标签, 通过原始方式):  
  175. <s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />  
  176.     <s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />  
  177.     <s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />  
  178.     <s:property value="#attr.a1"/><br />  
  179.     <s:property value="#attr.s1"/><br />  
  180.     <s:property value="#attr.r1"/><br />  
  181.     <s:debug></s:debug>  
  182.     <br />  
  183. 我们存入Map中的数据居然可以在request,等对象中得到,那么在struts内部他是将Map中的数据全部复制到了request,session等对象中的 #attr ,可以取得所有的属性,但是不推荐使用,为了防止同名的情况,造成无法区别。  
  184. 2)通过实现RequestAware,SessionAware, ApplicationAware 接口获取(最常用 和重要的一种)  
  185. private Map<String, Object> request;  
  186.     private Map<String, Object> session;  
  187.     private Map<String, Object> application;  
  188.       
  189.     //DI dependency injection  
  190.     //IoC inverse of control  
  191.     public String execute() {  
  192.         request.put("r1""r1");  
  193.         session.put("s1""s1");  
  194.         application.put("a1""a1");  
  195.         return SUCCESS;   
  196.     }  
  197.   
  198.     @Override  
  199.     public void setRequest(Map<String, Object> request) {  
  200.         this.request = request;  
  201.           
  202.     }  
  203.   
  204.     @Override  
  205.     public void setSession(Map<String, Object> session) {  
  206.         this.session = session;  
  207.           
  208.     }  
  209.   
  210.     @Override  
  211.     public void setApplication(Map<String, Object> application) {  
  212.         this.application = application;  
  213.           
  214.     }  
  215. 3)通过ServletActionContext()取得真实的相应的对象  
  216. private HttpServletRequest request;  
  217.     private HttpSession session;  
  218.     private ServletContext application;  
  219.       
  220.     public LoginAction3() {  
  221.         request = ServletActionContext.getRequest();  
  222.         session = request.getSession();  
  223.         application = session.getServletContext();  
  224.     }  
  225.       
  226.     public String execute() {  
  227.         request.setAttribute("r1""r1");  
  228.         session.setAttribute("s1""s1");  
  229.         application.setAttribute("a1""a1");  
  230.         return SUCCESS;   
  231.     }  
  232. (4)通过实现ServletRequestAware接口获得相应的对象  
  233.   private HttpServletRequest request;  
  234.     private HttpSession session;  
  235.     private ServletContext application;  
  236.       
  237.       
  238.       
  239.     public String execute() {  
  240.         request.setAttribute("r1""r1");  
  241.         session.setAttribute("s1""s1");  
  242.         application.setAttribute("a1""a1");  
  243.         return SUCCESS;   
  244.     }  
  245.   
  246.   
  247.   
  248.     @Override  
  249.     public void setServletRequest(HttpServletRequest request) {  
  250.         this.request = request;  
  251.         this.session = request.getSession();  
  252.         this.application = session.getServletContext();  
  253.     }   
原创粉丝点击