马士兵struts21笔记.docx
《马士兵struts21笔记.docx》由会员分享,可在线阅读,更多相关《马士兵struts21笔记.docx(22页珍藏版)》请在冰豆网上搜索。
马士兵struts21笔记
1、02_尚学堂马士兵_Struts2_Struts2_HelloWorld_2.avi
指定Tomcat的目录,指定JDK搭建开发环境(拷贝jar包,复制struts.xml文件此文件不要放在WEB-INF下面,应该放到src下面),在web.xml文件中:
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
其中/*不要写/*.do或者/*.action约定俗成用/*
在struts-2.1.8.1-all.zip包中可以找到struts.xml和web.xml
2、04_尚学堂马士兵_Struts2_Struts2_HelloWorld_3.avi
(1)
--:
常量的配置-->
--name="struts.devMode"value="true":
当前是开发模式,改动配置文件会自动装载默认是false-->
--命名空间--->action-->相应的处理类或页面-->
/Hello.jsp
反编译源文件,加载struts-2.1.8.1-all.zip下面core.src.java
(2)struts.xml不自动提示的解决办法:
window--perferences-XMLcatalog---add---keyType="URI"key="*.dtd"
3、09_尚学堂马士兵_Struts2_Struts2_HelloWorld_7_2.avi
struts2的执行流程:
当用户在浏览器中敲入要访问的地址的时候,浏览器会将这个请求发送给tomcat然后tomcat判断应该交给那个WebApplication来处理,然后会读取它下面的web.xml配置发现有配置:
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
因为为/*它会过滤所有的请求然后就交给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)标签如果没有指定name属性默认返回值为success
(3)标签中的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方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
/user/userAdd">添加用户
/user/user!
add">添加用户
前者会产生太多的action,所以不推荐使用
配置文件:
/user_add_success.jsp
/user_add_success.jsp
8、14_尚学堂马士兵_Struts2_Struts2_ActionWildcard_通配符配置.avi
主要学习通配符的使用通配符可以将配置量降到最低,不过一定要遵守"约定优于配置"的原则
/Student_{1}_success.jsp
--更简便的配置法-->
/{1}_{2}_success.jsp
说明:
(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类的处理类必须同时实现ModelDriven
add?
name=bbb进入处理类的时候会调用getModel()方法返回User对象并且把传过来的值set到里面,注意:
此时privateUseruser=newUser()不能只定义,要同时实现这样getModel()才能拿到user对象。
12、18_尚学堂马士兵_Struts2_Struts2_2.1.6版本的中文问题.avi
在配置文件中加入:
按照文档说明加入此句可解决中文乱码但是不行这是2.1.6的一个bug,会在下一个版本中修复如何解决呢:
在web.xml中:
struts2
--org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter-->
org.apache.struts2.dispatcher.FilterDispatcher
把过滤器的版本改成老版本的即可解决该问题!
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样式取出错误信息,不方便我们进行相应的处理-->
fielderrorfieldName="name"theme="simple"/>
--从存储错误信息的Map中拿数据-->
propertyvalue="errors.name[1]"/>
--显示详细的栈信息-->
debug>
debug>
14、21_尚学堂马士兵_Struts2_访问Web元素_1.avi
注意:
web.xml中关于struts的配置一定要采用2.1的,2.0的会取不到这是一个bug
(1)通过ActionContext对象取得Map类型的request,session,applicationHttpServletRequest,HttpSerletSessionServletContetext:
publicclassLoginAction1extendsActionSupport{
privateMaprequest;
privateMapsession;
privateMapapplication;
//访问此方法,取得相应的对象但是是Map类型
publicLoginAction1(){
request=(Map)ActionContext.getContext().get("request");
session=ActionContext.getContext().getSession();
application=ActionContext.getContext().getApplication();
}
//在Map类型的对象中存入相应的值
publicStringexecute(){
request.put("r1","r1");
session.put("s1","s1");
application.put("a1","a1");
returnSUCCESS;
}
}
//在页面中通过标签取得存入的数据二种方法(通过标签,通过原始方式):
propertyvalue="#request.r1"/>|<%=request.getAttribute("r1")%>
propertyvalue="#session.s1"/>|<%=session.getAttribute("s1")%>
propertyvalue="#application.a1"/>|<%=application.getAttribute("a1")%>
propertyvalue="#attr.a1"/>
propertyvalue="#attr.s1"/>
propertyvalue="#attr.r1"/>
debug>
debug>
我们存入Map中的数据居然可以在request,等对象中得到,那么在struts内部他是将Map中的数据全部复制到了request,session等对象中的#attr,可以取得所有的属性,但是不推荐使用,为了防止同名的情况,造成无法区别。
(2)通过实现RequestAware,SessionAware,ApplicationAware接口获取(最常用和重要的一种)
privateMaprequest;
privateMapsession;
privateMapapplication;
//DIdependencyinjection
//IoCinverseofcontrol
publicStringexecute(){
request.put("r1","r1");
session.put("s1","s1");
application.put("a1","a1");
returnSUCCESS;
}
@Override
publicvoidsetRequest(Maprequest){
this.request=request;
}
@Override
publicvoidsetSession(Mapsession){
this.session=session;
}
@Override
publicvoidsetApplication(Mapapplication){
this.application=application;
}
(3)通过ServletActionContext()取得真实的相应的对象
privateHttpServletRequestrequest;
privateHttpSessionsession;
privateServletContextapplication;
publicLoginAction3(){
request=ServletActionContext.getRequest();
session=request.getSession();
application=session.getServletContext();
}
publicStringexecute(){
request.setAttribute("r1","r1");
session.setAttribute("s1","s1");
application.setAttribute("a1","a1");
returnSUCCESS;
}
(4)通过实现ServletRequestAware接口获得相应的对象
privateHttpServletRequestrequest;
privateHttpSessionsession;
privateServletContextapplication;
publicStringexecute(){
request.setAttribute("r1","r1");
session.setAttribute("s1","s1");
application.setAttribute("a1","a1");
returnSUCCESS;
}
@Override
publicvoidsetServletRequest(HttpServletRequestrequest){
this.request=request;
this.session=request.getSession();
this.application=session.getServletContext();
}
15、23_尚学堂马士兵_Struts2_模块包含
可以将别的写好的配置文件直接包含到struts得配置文件中,方便多人开发避免不必要的配置文件冲突.
login.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
/user_login_success.jsp
16、24_尚学堂马士兵_Struts2_默认Action
--当配置文件中没有用户要访问的Aciton的时候,会调用
/default.jsp
17、27_尚学堂马士兵_Struts2_结果类型_result_type_1
ResultType的最常用的几种配置:
(四种配置分别代表了四种不同的跳转方式)
--type不写默认的为dispatcher:
用服务器跳转跳转到结果页面--只能跳转到页面,不能跳转到Action-->
/r1.jsp
--客户端跳转的方式跳转到结果页面只能跳转到页面,不能跳转到Action-->
/r2.jsp
--服务器跳转的方式跳转到Action-->
r1