尚学堂struts2笔记

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

●Action
1.struts2的作用就是让用户请求和返回视图(servlet api)分离。

space决定了action的访问路径,默认为"",可以接收所有路径的action
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action,
/xxx/index.action,或者/xxx/yyy/index.action.
namespace最好也用模块来进行命名

3.具体视图的返回可以由用户自己定义的Action来决定
具体的手段是根据返回的字符串找到对应的配置项,来决定视图的内容
具体Action的实现可以是一个普通的java类,里面有public String execute方法即可
或者实现Action接口
不过最常用的是从ActionSupport继承,好处在于可以直接使用Struts2封装好的方法

4.struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath

5.Action执行的时候并不一定要执行execute方法
可以在配置文件中配置Action的时候用method=来指定执行哪个方法
也可以在url地址中动态指定(动态方法调用DMI)(推荐)
前者会产生太多的action,所以不推荐使用

6.使用通配符,将配置量降到最低
不过,一定要遵守"约定优于配置"的原则,即命名规则统一。

/Student{1}_success.jsp
*代替字符串,{1}代表第一个*所匹配的字符串。

/{1}_{2}_success.jsp

7.使用action属性接收参数,在URL地址中传的参数和action里的成员变量可以是一一对应的,
action初始化时,会自动将成员变量的值初始化成参数的值。(struts调set方法,所以set方法名
和url参数的名必须匹配而真正的成员变量名不一定非要匹配)

8.使用Domain el(领域模型)接收参数 action类中可以不写具体的属性而将其写入领域模型中,
然后action类中持有一个领域模型的对象的引用,在url中同样可以传参数直接对领域模型对象的属性赋值,
写法为 namespace/actionname!method?domainmodel.parameter=XXX&domainmodel.parameter=XXX,
(也可能是method?domainmodel.parameter.parameter.parameter=XXX,此时domainmodel成员变量为另一个对象,
另一个对象的成员变量为另另一个对象)
当领域模型与实际参数的属性不同时,如,password往往有确认password,则新建一个dataTransformObject类来接收参数并判断,再初始化领域模型。此时action类中持有的则是DTO的引用。

9.我们也可以使action类实现ModelDriv

en接口,使用接口中的getmodle方法来使action自动获得领域模型,这样即使在action类中包含了领域模型的引用,同样可以在url中直接写 namespace/actionname!method?parameter=XXX¶meter=XXX.

10. struts.xml解决中文问题的标签,这些标签可以在struts2-core-2.1.6.jar中的org.apache.struts2中的default.properties中查询默认值。
在2.1.6之前,中文问题是个BUG,在2.1.7中已修正。

11.使用struts的标签来将程序中对用户的提示信息打印到前台页面:
在后台 使用this.addFieldError("name","name is error");其中name为action中的属性,
"name is error"为错误信息的提示
将带有简单格式的提示信息打印到前台
首先,在前台页面中包含<%@taglib uri="/struts-tags" prefix="s" %>
在META-INF下struts-tag.tld中有标签详细信息 页面中使用
可以观察ValueStack里保存的action中的属性。
属性都是存在map中的,有值,有名,而 值,是个数组,
所以我们用可以取到错误信息的具体字符串。

12.
一、
后台程序可以通过ActionSupport中的方法
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
得到map类型的 request,session,application.
还可以通过put方法对这些名值对进行赋值。
在前台页面,可以通过
| <%=request.getAttribute("r1") %>

| <%=session.getAttribute("s1") %>

| <%=application.getAttribute("a1") %>

来拿到所设置的request、session、application.既用#key来访问或者用最原始的jsp语言来访问。

二(常用)、
同样设置三个成员变量 但使用范型
private Map request;
private Map session;
private Map application;
然后设置set方法,由struts将页面元素对象自动设置进去(实现RequestAware,SessionAware,ApplicationAware),
然后调用put方法,往进写东西。

三、
同样设置三个成员变量 但类型不同
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
然后初始化
request = ServletActionContext.getRequest();
session = request.getSession();
application = session.getServletContext();
然后由request.setAttribute("r1", "r1")往进设置值。

四、
同样设置三个成员变量
private HttpServletRequest request;
private HttpSession session;
private ServletContext application;
初始化
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
this.application = session.getServletConte

xt();
}
然后由request.setAttribute("r1", "r1")设值。

13.模块包含
在struts.xml中可以将其他xml文档包含

这样的好处是,多个模块可以同时开发,然后包含就可以协作工作。

14.默认action
在url的namespace后什么都不敲入或敲入不存在的action时,访问默认的action

然后再jsp中使用接受参数。
●result
15.result的type(类型)属性
·默认为dispatcher 运用jsp跳转(forward)到结果页面 不能跳转到action
·redirect 重定向到结果页面 不能跳转到action
·chain forward跳转到一个action
·redirectAction 重定向到一个action
·freemarker
·httpheader 发一个http的头信息
·stream 下载
·velocity
·xslt xml的修饰
·plaintext 页面源码
·tiles 页面分块后动态指定
假如chain forward调转的action在包内

adfadf
/XXXXXX

在struts-2.2.1.1-docs/struts-2.2.1.1/docs/chain-result.html可查

16.global-results全局结果集在,同一个package中大家可以共用的结果视图

/main.jsp

其他package中也想使用此package的result,则extends="packagename"

则此包内拥有user包的action

17.动态结果集 即${r},此时r为action的成员变量
r的值可以动态指定为一个字符串,例如"/user_success.jsp"。

18.带参数的结果集。
由于forward服务器内跳转共享一个值栈,所以参数也共享,即没有必要传。
而再redirect客户端重定向的时候,值栈不共享,是两次request过程,
此时希望action向新定向到的页面传参数需要使用?paramname=${paramname}
/user_success.jsp?t=${type}
此时如果在user_success.jsp使用struts的
标签取值取不出,因为不是action没有值栈actionstack。
只能用从actioncontext中取。

●ognl表达式
1.action中的成员变量为domainmodel对象引用时,可以在前台传参数来初始化这个对象,不传不构造,
也可以自己new。但是,如果要使用传参来初始化的时候domainmodel必须有一个空的构造方法。。

2.
访问值栈中的action的普通属性 直接写属性名
访问值栈中对象的普通属性 对象名.成员变量名(是对象).成员变量名
访问值栈中对象的普通方法 对象名.方法名()
访问值栈中action的普通方法 直接写方法名()

3.
访问静态方法 @类名@方法名()
在struts中要有一个设置
设置后才允许静态方法访问,这些在default.properties配置文件中可以查到
访问静态属性 @类名@属性名
访问Math类的静态方法: @@方法名

4.
访问普通类的构造方法: new 全类名(参数)
访问List中某个元素: List名[下标]
访问List中元素某个属性的集合: 把users中每个user拿出来,
再把每个user的age拿出来组成一个新的List。 list名.{属性名}
访问List中元素某个属性的集合中的特定值: 把users中每个user拿出来,
再把每个user的age拿出来组成一个新的List,取第0个。 list名.{属性名}[下标]
访问Set:
访问Set中某个元素: 由于set是无序的所以取不到
访问Map:
访问Map中某个元素: map名.key名 或者dogMap['dog101']或者dogMap[\"dog101\"]
访问Map中所有的key: 拿到了key的集合
访问Map中所有的value: 拿到了value的集合
访问容器的大小: | 不加()也可以,
ognl认为它是个属性。

5.
投影(过滤):
从users(list)中拿出age为1的user并将其放入集合,取第0个。
投影:
从users中拿出age大于1的 取开头那个 把年龄输出
投影:
从users中拿出age大于1的 取结尾那个 把年龄输出
投影:
从users中拿出age大于1的 取结尾那个的年龄 看是否为空

6.
用[]访问valuestack里面的元素 action永远在栈顶
[]: 此时访问的是从0位置开始也就是从action的位置
开始往下的元素直到栈底。如果用到服务器端跳转,用到的action会挨个被压入valuestack中。

●Struts标签
1.property

将username属性的值打印出来

将username字符串打印出来

为admin属性设置默认值,如果valuestack中没有则打印默认值

默认为true,将标签转译成字符显示,而不是直接显示标签。
false时,不转译,即浏览器直接显示标签样式。

2.set 往指定或非指定范围内设定变量并指定


常用于给actioncontext中的param中的变量命名

将名为adminName的变量设置到request和ActionContext中
值为username的值,此时


都可以将adminName的值显示

为adminPassword变量设定范围,name=这种写法已经被废弃

上面代码显示,
当scope(范围)为session时,
在debug标签中看到actionContext中的session有值,

所以必须从session中取而不能直接取值。

3.bean 创建name指定的类的对象并用var命名
不用var命名,会只在值栈中压入创建的对象,
标签结束时消除对象,所以标签外访问不到。
反之,则在stackcontext中,标签结束后同样可以取到。



param属性为对象的成员变量设置值,name为名,value为值。
注意value为ognl所以字符串要加单引号。

4.include 包含英文文件(中文会出问题)

或者


%{}的意思为将大括号中的内容强制当成ognl表达式

5.if elseif
url传参数后在actionContext中的parameters中会有对应参数和值
可以查看参数age的值
wrong age!
too young!
yeah!

6.iterator

|

ognl{}内为集合,iterator标签将集合中的内容遍历
依次打印出来

|

每次遍历将集合的元素赋予x,
在property标签中调用其转换大写方法转换为大写

|
遍历过的元素总数: |
遍历过的元素索引: |
当前是偶数?: |
当前是奇数?: |
是第一个元素吗?: |
是最后一个元素吗?:

在iterator中有个状态标签status,有许多属性,如元素总数,索引,奇偶等,

|

ognl中的map写法为 键:值
取键,value="value"取值

"#{1:'a', 2:'b', 3:'c'}" var="x">
|

用var=x代表其中一个条目,value=#x.key取这个条目的键,#x.value取这个条目的值

7.fielderror当action类中
this.addFieldError("fielderror.test", "wrong!");
前台可以用fielderror将其显示


8.ui
疑问 struts.xml中的constant标签有哪些属性
开启热部署
允许访问静态方法

解决中文问题


国际化全局配置

9.struts Exception handling—声明式异常处理
在struts中 class中的方法可以在捕获异常后将其抛出,
这样可以支持struts的声明式处理任何异常。
在struts.xml中

/error.jsp





必须把results写前面!
对异常做出映射,当发生ng.Exception时,返回error这个result.

10.struts 的bug问题
该设置不会解析action的方法只会简单的将result返回BUG。

要想设置首页,目前只能在web.xml中配置

index


11.i18n:支持程序国际化
1.i18n原理
a)ResourceBundle和Locale的概念
ResourceBundle res = ResourceBundle.getBundle("app", Locale.CHINA);
System.out.println(res.getString("welcome.msg" ));
b)资源文件
app_en_US.properties app_英语缩写_美国.properties
内容: welcome.msg=hello,sir
app_zh_CH.properties app_中华缩写_中国.properties
c)native2ascii jdk/bin/native2ascii 可以将中文转换成iso8859-1
2.Struts的资源文件
a)app级 见原理

b)propertiesEditor插件
i. 解压
ii. features plugin 覆盖到myeclipse中的eclipse目录里
3.Action级别国际化
a)jsp中

这里可以直接调用方法说明action中有这个方法
这个方法其实是Actionsupport中的方法
b)LoginAction_en_US.properties中
ername=username:
login.password=password:
login.login=login
4.package级别国际化 在包内
package_en_US.propertiesss
5.全局级别国际化 (常用)
XXXX_en_US.properties 在src目录内
在struts.xml中配


6.动态字符的国际化
properties中
welcome.msg=welcome:{0}
jsp文件中




7.动态语言切换
struts中可以直接在url后传参数实现动态语言切换
"admin/lang?request_locale=en_US"

12.自定义拦截器







/test.jsp






13.使用struts的token拦截器




/error.jsp
最后一句写明当返回为invalid.token时的结果页面



相关文档
最新文档