struts221学习笔记.docx
《struts221学习笔记.docx》由会员分享,可在线阅读,更多相关《struts221学习笔记.docx(29页珍藏版)》请在冰豆网上搜索。
![struts221学习笔记.docx](https://file1.bdocx.com/fileroot1/2023-2/22/80d4be0b-41ab-4f40-836b-376ba76b6b52/80d4be0b-41ab-4f40-836b-376ba76b6b521.gif)
struts221学习笔记
1、首先在在struts-2.2.1.1\apps\struts2-blank\WEB-INF\classes目录下拷贝struts.xml至src下粘贴。
再拷贝struts-2.2.1.1\apps\struts2-blank\WEB-INF下web.xml里的filter到web.xml。
2、一般/*用写*号,虽然有时候用*.Action也可以。
默认过滤所以请求。
被org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter接收到。
首先看namespace(struts.xml),这里namespace为”/”再去找里面有没有hello的action,如果有去找对应的result应用的项。
3、Struts.xml里面中namespace=”/”中的”/”与我们在浏览器中访问的路径一一对应。
Locahost:
8080/my/最后面的一个”/”对应要访问下面action需要localhost:
8080/my/hello.action就可以,不然会出错。
4、在struts.xml里面复制把value改为true,则表示,开发模式,重启tomcat服务器,就可以了。
这样更改配置很会自动更新
5、在struts.xml里面”<”提示。
在struts2文件夹里面,随便找一个struts2-core的jar文件解压,struts.xml里的dtd文件,为http:
//struts.apache.org/dtds/struts-2.0.dtd,把struts-2.0.dtd加入到xml的catalog里面就可以了。
”windows”--“Preferences”再”MyEclipse”--“FilesandEditors”—“XML”—“XMLcatalog”在XMLcatalogEntries里按add,keyType为上面的url,key的值为:
http:
//struts.apache.org/dtds/struts-2.0.dtd,location为struts-2.0.dtd所在目录,点击ok就可以了。
6、
7、namespace决定了action的访问路径,默认为""(意味着不写,不管在浏览器哪里敲action,都会查找下面的action,在其它namespace找不到的action都交给默认为””的namespace去处理),可以访问所有路径的action,namespac可以写成"/",或"/xxx"或"/xxx/yyy","/xxx/index.action",namespace最好也用模块来命名(package也一样尽量用模块来命名)。
当需要访问namespace="/front"时,需要在action前面带上/front/hello.action.,当没有找到对应的namespace时候会返回tomcat服务器,web.xml,welcome-file
8、result默认名字为SUCCESS成功。
9、当复制一个项目的时候,需要注意,名字虽然改成了“T”,部署到tomcat服务器,但是却访问不到路径,其实他还是原画的名字,能访问,所以我们要改”WebContext-root”改成与项目名字相同(T)就可以访问了,如:
10、当访问action的时候,会找到对应的class类对象,每一次访问必定会new一个此类对象(struts1是服务器启动就自动new一个对象,这样会出现线程同步问题),自动执行execute()方法反回一个String值。
当不配置class时,默认执行的是ActionSupport返回success
11、定义自己的action
a)实现Action接口
b)从ActionSupport继承。
(常用)可以直接调用struts2封装好的方法
c)直接publicStringexectue(){}
12、路径问题:
a)在jsp页面里面,如果是action映射成功的,那么在里面的不会去表示jsp当前页面,而是action映射的路径。
可以用jsp自动生成前面的:
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";%>
12、在这里可以自己定义方法。
只要返回的是一个String就可以了。
有一种动态的调用dmi,能过user!
add来指定类名和方法名,调用。
13、可以使用通配符配置。
”*”是第一个通配符,{2}代表第二个通配符,代表一个字符串,如ActionAdd时候就会自动找到 Action*,ActionDelet的时候,也会自动找到Action*,{1}表示第一个*号,这里代表Add和Delete。
在下面的result的时候,也可以用*代表这个字符串。
首先匹配最精确的
14、“约定优于配置!
”
15、在有些项目名称更改之后,无意断开,会导致web.xml文件破坏,需要重新复制filter进去。
16、还有可能是编译1.5版本与jdk的版本不匹配。
或者是tomcat中的jdk版本不匹配,具体中:
a)
b)
17、Action传递参数:
a)在自己的Action里定义属性,写好get,set方法,当new时会自动设置(传值)。
url里面的参数的Action里的成员变量可以是一一对应的。
变量名与url里也可以不相同,但是会自动调用setName()中set后面的方法名字,必须与url相同。
b)方法二:
可以直接使用user对象,传递参数,user.name=name;当model与的属性数量不相等时候,不能用域模型model,用do/dto/vo。
另外定义一个dto类,只用来传递参数,交给model对应的参数和其它的参数值。
(当父类与子类有相同的属性名时候,在url里面有相同赋值,则当前类(子类)优先)
c)方法三:
modelDrivenInput,实现ModelDriven模型驱动这个接口。
这个时候user必须自己new,tomcat不会自动去new。
1.publicclassTeacherAddextendsActionSupportimplementsModelDriven{
2.Useruser=newUser();
3.Strings;
4.publicStringgetS(){
5.returns;
6.}
7.publicvoidsetS(Strings){
8.this.s=s;
9.}
10.publicStringAdd()throwsException{
11.System.out.println("ModelDrivenname:
"+user.getName());
12.System.out.println("ModelDrivenage:
"+user.getAge());
13.System.out.println("ModelDrivens:
"+s);
14.returnSUCCESS;
15.}
16.@Override
17.publicUsergetModel(){
18.//TODOAuto-generatedmethodstub
19.returnuser;
20.}
21.}
22.//这样能接收多个参数,包括模型里面以外。
d)总结,接收的参数往往是交给参数的模型去处理。
18、有中文尽量不要用get提交数据,用post。
19、中文乱码问题:
a)Struts.xml里加上一句,实际上就已经解决了中文乱码问题。
在1.1.7版本之后可用,在1.1.6之前这是一个bug
b)有时候把web.xml里的过滤类org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter这是2.1改在2.0的:
org.apache.struts2.dispatcher.FilterDispatcher有时候也可以解决乱码问题。
20、Struts2学习在\struts-2.2.1.1\docs\WW文件里面home.html里guides.html打开。
基本上所有的配置都在里面。
21、在struts2里面this.addFieldError(“name”,”nameerrot”)添加属性错误信息(继承ActionSupport类this.addFieldError是从该类继承)。
a)要把错误属性担出来需要用struts2标签。
fielderrorfieldName=”name”theme=”simple”/>theme可写可不写。
不能更改展现。
只能重写css的class,右击查看源码,修改对应的class。
b)bug>
dug>查看所有bug,常用
c)properytvalue=”error.name[0]/>取属性展现出来,可以取bug>
dug>里的属性。
Error是一个map,想取里面的内容用error.name[0](ognl表达式。
)
22、访问web元素,request,session,application,HttpServletRequest,HttpSession,ServletContext。
a)取得request,session,application,利用ActionContext拿到Map值(一般有Context是封装环境),当我们利用些对象request.put身变量里复制时候,会全部复制到http的request对象里去,在前台就能访问了。
都不是单例。
Request.getAttru...(“name”)和获取值。
b)(只用这种,除非特殊情况)实现接口ApplicationAware,RequestAware,SessionAware,(Aware得知,知道,获得)要求提供三个方法,setRequest,setSession,setApplication,当实现上面三个接口就应该知道对应的request,session,application的存在。
(实现ioc(inverseofcontrol)或di(dependencyinjection)设计思想),依赖注入到request里面或本来由自己控制,现在由别人控制。
最常用的。
Request在类里面也很少拿。
将http原始的request转换成map类型的request.<%=request.getAttribute("name")%>
用这种方法取值
c)若想访问http里的request,session,application类型,定义为HttpServletRequest,HttpSession,ServletContext。
实现接口ServletRequestAware,对应一个setServeltRequest方法,给变量赋值。
23、Struts.xml里面配置可以包含其它xml文件,当成struts.xml里的一部分。
24、DefaultAction默认 Action的引用。
如果找不到对应的Action就去找它。
但是找到后,不会去执行它的Action里的配置的类,只是单纯的跳转到指定的页面。
。
(注意这里面的这是一个bug,可以在web.xml的defaultAciton设置默认Action这样可以省去default-action-ref了。
)有待解决!
25、注意解决问题的方式。
26、Result类型,在定义result的时候可以定义一个类型。
默认是dispatcher,服务器跳转(forward跳转只能跳转到页面)。
a)Dispatcher(默认)
b)Redirect(点击之后url显示的是jsp的地址)
c)Chain(服务器跳转到Action)
d)redirectAction(客户端跳转到Action)
e)freemarker
f)httpheader
g)stream
h)velocity
i)xslt
j)plaintext
k)tiles
27、${r}r是Action的一个成员变量。
对于任何一个Action的属性都会放到堆栈里面,Vlauestackcontents里面。
R是Action的一个属性可以用{r}取值,而r是动态确定的,叫动态结果集。
Ognl表达式。
(不常用)
28、Jsp页面从值栈取值,propertyvalue=”#parameters.r”>
29、将Actionr的参数传递出来,也可以/user_success.jsp?
name={name}
30、其中extends继承,相当于继承包的配置,这里继承struts缺省值。
也可以extends=“user”继承了包为user的所有配置。
(这是很常用的方法)
31、/main.jsp全局的共用结果集。
32、凡是forward过程共享一个值栈。
33、作业
34、看文档(学会使用文档)doc文档,struts-tags
35、设计BBS(做一个约定,在项目经理下)
36、
Ognl(ObjectGraphNavigationlanguage)
37、
38、先做原型再一点一点向上包。
这种模式更容易适应需求,迭代式作试验。
39、propertyvalue=”username”/>基中username是OGNL表达式。
{}也是ognl表达式。
40、只有我们在url里面传user.xxx,才会构造user方法。
如果在url里面不传递参数user.xxx只有xxx则也可以,但是需要自己new在类里面new一个user对象。
空的构造方法没有时候,就不会自动初始化。
。
41、一般DomaModel都要提供无参的构造函数。
否则会出错。
42、访问Action多级Cat.friend.name是可以的propertyvalue=”Cat.friend.name”/>调用方法也是一样的,很直观,Cat,friend.getClass(),但是直接调用方法的时候只能是针对Action,不用类名只写方法名。
43、访问当前值栈的方法也可以用propertyvalue=”m()”/>
44、访问静态方法,访问静态属性propertyvalue=”@+类名+@+方法/属性”/>例propertyvalue=”@Cat@getName()”/>,但是在2.1里面改了一个设置,要在struts.xml里面加上:
,才能成功访问的静态方法。
访问Math类的静态方法,s:
propertyvalue=”@@max(2,3)”/>其它类不能用此方法。
45、访问普通类的构造方法propertyvalue=”newCat(“name”)”/>
46、访问普通类的集合:
a)访问list和数组一模一样:
propertyvalue=”users”/>
b)访问list某个元素:
propertyvalue=”users[0]”/>
c)访问list某个属性集合:
propertyvalue=”users.{age}”/>,{}在ognl里可以代表一个集合。
返回users里age的那个集合。
d)访问list某个属性集合中某个特定值:
propertyvalue=”users.{age}[0]”/>或propertyvalue=”users[0].{age}”/>
e)访问Set集合:
propertyvalue=”dogs”/>
f)访问Set某个元素:
propertyvalue=”dogs[0]”/>(一般取不到,因为Set里元素没有顺序。
没有意义)
g)访问Map集合:
propertyvalue=”dogMap”/>
h)访问Map中某个元素:
propertyvalue=”dogMap.dog101”/>
i)访问Map中所有的key:
propertyvalue=”dogMap.keys”/>
j)访问Map中所有的value:
propertyvalue=”dogMap.values”/>
k)访问Map的大小:
propertyvalue=”dogMap.size()”/>
47、投影(过滤)
a)propertyvalue=”users{?
#this.age==1}.{age}”/>,这样比较users里的每一个对象,进行比较,得出结果。
只有?
#或$#或^#这三种
b)propertyvalue=”users{^#this.age>1}.{age}”/>大于1集合里元素的第一个。
c)propertyvalue=”users{$#this.age>1}.{age}”/>大于1集合里元素的结尾的一个。
d)propertyvalue=”users{$#this.age>1}.{age}==null”/>输出true/false
48、用[]访问元素:
propertyvalue=”[0]”/>访问ognl里面的对象集合。
可以propertyvalue=”[0].username”/>第一个Action里没有username没有,则继续找。
当内部服务器跳转时候可能会产生值栈里两个Action。
可能会更多。
49、在ognl里面可以用一个单引号代表一个双引号。
不能跟java混淆
50、Js动态的指定连接内容:
onclick=”javascript:
documents.f.action=’login1’;document.f.submit();”onclick=”javascript:
documents.f.action=’login2’;document.f.submit();”
51、StackContext.顾名思义,栈的上下文环境.访问的时候,通过#key来访问.如下:
假设reques中有名为obj属性的值.使用OGNL表达式访问.property value="#request.obj” />这样就可以取到stackContext中的值.
52、Struts-tags
53、多做试验GenericTagRefernce
54、标签里有的是ognl表达式,有的是字符串。
propertyvalue=”username”/>由于value是一个object表达式,所以struts2会把username解析为ognl表达式,若想传真真的字符串,只能:
propertyvalue=”’username’”/>
55、如果值取不到,可以用这个方法设置默认值:
propertyvalue=”username”default=”黄标”/>
56、设定HTML:
propertyvalue=”
”escape=”false”/>默认escape为true.默认不会转换为html语言。
Escape是否解析与html相关的字符串。
57、Set标签:
(一般很少用,一般用来换名字用。
如果变量名太长,但是用到多次就可以用来换行)
a)设置变量的值。
Var变量名,value值:
setvar=”username”value=”黄标”/>,默认(scope范围为Action)放在request和ActionContext里面.
b)从reuqest取值:
propertyvalue=”#request.username”/>
c)从ActionContext取值propertyvalue=”#username”/>
d)从相应的范围取值:
propertyname=”userPassword”value=”password”scope=”page”/>如果能取出来说明在我们配置文件已经有这个属性了。
e)设定var范围为ActionContext:
setname=”userPassword”value=”password”var=”a”/>其中name已经被废弃了。
setvalue=”password”var=”a”/>
f)从相应的范围取值:
propertyvalue=”#session.username”/>就直接用#username取不到,2.1就算你用了var在ActionContext里面也不能用#username取到值。
58、Bean标签
a)定义bean并使用param来设定新的属性值。
beanname=”Cat”>
bean>
b)定义的bean在debug里如果不定义变量是找不到的:
beanname=”Cat”var=”myDog”>
bean>,会显示在StackContext.把改成beanname=”Cat”>debug>
debug>
bean>,就可以在valueStackContents里看到Dog对象了。
放到栈里面去。
当s:
bean结束后就从栈里拿走了,就不能访问了。
c)paramname=”name”value=”dagou”>
param>这样是不行的,他会把dagou当成是ognl表达式,所以找不着。
59、Include标签(很少用)(中文不能)
a)