1、02_尚学堂马士兵_Struts2_Struts2_HelloWorld_2.avi指定Tomcat的目录,指定JDK搭建开发环境(拷贝jar包,复制struts.xml文件此文件不要放在WEB-INF下面,应该放到src下面),在web.xml文件中:filterfilter-namestruts2/filter-namefilter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class/filterfilter-mappingfilter-namestruts2/filter-nameurl-pattern/*/url-pattern/filter-mapping其中url-pattern/*/url-pattern不要写/*.do或者/*.action约定俗成用/*2、04_尚学堂马士兵_Struts2_Struts2_HelloWorld_3.avi(1)!--constant:常量的配置--!--name=struts.devModevalue=true:当前是开发模式,改动配置文件会自动装载默认是false--!--命名空间---action--相应的处理类或页面--constantname=struts.devModevalue=true/packagename=defaultnamespace=/extends=struts-defaultactionname=hellclass=package+classxxxxresult/Hello.jsp/result/action/package(2)struts.xml不自动提示的解决办法:window--perferences-XMLcatalog---add---keyType=URIkey=*.dtd3、09_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_2.avistruts2的执行流程:当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给那个WebApplication来处理,然后会读取它下面的web.xml配置发现有配置:filterfilter-namestruts2/filter-namefilter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class/filterfilter-mappingfilter-namestruts2/filter-nameurl-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的访问路径,默认为,可以接收所有路径的actionnamespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,/xxx/index.action,或者/xxx/yyy/index.actionnamespace最好也用模块来进行命名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()返回的协议名称.默认是httprequest.getServerName()就是获取你的网站的域名,如果是在本地的话就是localhostrequest.getServerPort()获取服务的端口号7、13_尚学堂马士兵_Struts2_Struts2_ActionMethod_DMI_动态方法调用.aviAction执行的时候并不一定要执行execute方法br/可以在配置文件中配置Action的时候用method=来指定执行哪个方法也可以在url地址中动态指定(动态方法调用DMI)(推荐)br/ahref=%=context%/user/userAdd添加用户/abr/ahref=%=context%/user/user!add添加用户/abr/前者会产生太多的action,所以不推荐使用配置文件:packagename=userextends=struts-defaultnamespace=/useractionname=userAddclass=com.bjsxt.struts2.user.action.UserActionmethod=addresult/user_add_success.jsp/result/actionactionname=userclass=com.bjsxt.struts2.user.action.UserActionresult/user_add_success.jsp/result/action/package8、14_尚学堂马士兵_Struts2_Struts2_ActionWildcard_通配符配置.avi主要学习通配符的使用通配符可以将配置量降到最低,不过一定要遵守约定优于配置的原则packagename=actionsextends=struts-defaultnamespace=/actionsactionname=Student_add/actionactionname=Student_*class=com.bjsxt.struts2.action.StudentActionmethod={1}result/Student_{1}_success.jsp/result/action!--更简便的配置法--actionname=*_*class=com.bjsxt.struts2.action.{1}Actionmethod={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如果要接受的参数的个数很多,我们可以不用定义属性而是直接定义一个对象例如:privateUseruser(setget方法)在调用Action传值的时候使用user!add?user.name=x&user.age=x的方式进行值得传递。(最常用的方式)11、17_尚学堂马士兵_Struts2_Struts2_用ModelDriven接收参数.avi继承ActionSupport类的处理类必须同时实现ModelDrivenObject(实现getModel())在传值的时候使用user/user!add?name=bbb进入处理类的时候会调用getModel()方法返回User对象并且把传过来的值set到里面,注意:此时privateUseruser=newUser()不能只定义,要同时实现这样getModel()才能拿到user对象。12、18_尚学堂马士兵_Struts2_Struts2_2.1.6版本的中文问题.avi在配置文件中加入:constantname=struts.i18n.encodingvalue=GBK/按照文档说明加入此句可解决中文乱码但是不行这是2.1.6的一个bug,会在下一个版本中修复如何解决呢:在web.xml中:filter-namestruts2/filter-name!--filter-classorg.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter/filter-class--filter-classorg.apache.struts2.dispatcher.FilterDispatcher/filter-class把过滤器的版本改成老版本的即可解决该问题!13、19_尚学堂马士兵_Struts2_简单数据验证_1.avi使用addFieldError方法和s:fieldError标签简单处理数据校验publicStringadd(){if(name==null||!name.equals(admin)){this.addFieldError(name,nameiserror);this.addFieldError(name,nameistoolong);returnERROR;}returnSUCCESS;}在页面中显示错误信息:!--以固定的css样式取出错误信息,不方便我们进行相应的处理--s:fielderrorfieldName=nametheme=simple/!--从存储错误信息的Map中拿数据--s:propertyvalue=errors.name[1]/!--显示详细的栈信息--s:debug/s:debug14、21_尚学堂马士兵_Struts2_访问Web元素_1.avi注意:web.xml中关于struts的配置一定要采用2.1的,2.0的会取不到