假 如 你 的 人 生 有 理 想,那 么 就 一 定 要 去 追,不 管 你 现 在 的 理 想 在 别 人 看 来是 多 么 的 可 笑 , 你 也 不 用 在 乎 , 人 生 蹉 跎 几 十 年 , 如 果 年 轻 的 时 候 计 较 得 失 前 怕 狼 就 后 怕 虎 而 不 去 追 逐, 等 到 了 40, 50 岁 的 时 候 , 你 唯 一 能 做 的 就 是 感 叹 岁 月 的 消 逝 和 无 情…
a) 打开eclipse
b) 新建项目
c) 选择myeclipse-java enterprise projects-web project
d) 项目名称:struts2_0100_introduction
e) 选择java ee 5.0
a) window – preferences – myeclipse – servers – tomcat – 6.x
b) 选择tomcat home directory
c) 选择enable
d) finish
a) window – preferences – java – installed jres
b) 如果没有对应的JDK(不是JRE),选择add
c) 选择standard VM -> next
d) 选择JDK对应的Directory
e) 将刚刚设定的JDK设为默认
a) 找到struts目录下对应的apps目录
b) 解压struts2-blank-2.1.6.war
c) Copy对应的lib的jar文件,需要除junit和spring-test之外的所有文件,其中commons-io的jar包会在文件上传和下载时需要,其他为必须
d) Copy对应的struts.xml到src目录,在package explorer视图进行操作
e) 注释掉struts.xml的多余内容
f) 建立HelloStruts2_1.jsp文件
g) *修改jsp文件的默认编码属性window-preferences-web-jspfiles-设为Chinese,National Standard
h) 在struts.xml中照原配置进行对应的配置
i) 修改对应的web.xml,建立struts2的filter(参考struts自带的项目)
a) 可以首先部署到tomcat上项目
b) 也可以项目右键debug as – myeclipse server app,选择刚刚建立好的server
a) 学习建立struts的dev-mode,好处在于我们修改了配置文件的时候能够自动热替换
b) 建立jar文件对应的源码D:/share/tools/struts-2.1.6/src/core/src/main/java,以及xwork对应的源码,以及对应的javadoc location,(更好的方式是建立自己的user-library)
c) 浏览struts的目录
d) 认识eclipse jee的项目部署目录,认识如何修改webapp的context-root,项目copy改名后可能会出现的问题
e) package explorer – 建立jar的源文件和目标关联,navigator – 观察所有的内容
f) 认识Action的后缀名,在struts2默认中,带不带action都可以
a) window – preferences – 搜索 catalog – add
b) 选择key type为URI
c) key: http://struts.apache.org/dtds/struts-2.0.dtd
d) location: 对应的dtd文件,位于struts-core包中,解压开,指定相应位置,如:D:\share\0750_Struts2.1.6\soft\struts-2.1.6\lib\struts2-core-2.1.6\struts-2.0.dtd
a) 注意JDK的版本,应该是JDK6,否则会出class version的问题
b) 如果总是项目出问题,可以重建项目,单独拷文件
c) 还有一种情况是项目右键,properties – java – compiler 选择6.0
d) 另外,在tomcat配置中也要使用jdk6
a) tomcat路径带了空格
a) web.xml不要使用2.0的filter,用新的
a) 用default-action-ref指定一个action
b) 用*_*映射
c) 在地址栏中访问一个不存在的action,如adfsdfsfs
d) 结果居然会映射到*_*上
e) 如果换成*__*就没问题了
f) 靠,只能认为是bug
g) 下次用*-*,不用*_*
Struts1中用户访问一个action只创建一次,而struts2在每次访问时都会创建一个action(不存在线程同步)
Path问题:相对地址是根据地址栏中的url来定位,并不是根据jsp文件路径来确定,统一使用绝对路径。(myeclipse中的base标签)
访问url:ActionName!Action中的方法;
a) *_*
{1}对应第一个*
约定由于配置
属性传递:调用action中的set和get方法进行传递参数和接受参数
DomainModel传递:url中使用model.para形式传递参数
ModelDriven传递:getModel()方法,url中不用带model.para
a) 一般不使用Struts2的UI标签
b) <s:debug></s:debug>显示stackContext(actionContext是一个ThreadLocal对象)
在<s:property/>中value=“#request”访问其中的内容
(Map类型的request,session,application,
真实类型的HttpServletRequest,HttpSession,ServletContext)
a) Map类型
b) 原始类型
a) dispatcher(默认):服务器跳转,利用服务器跳转(forward)到页面(jsp等)
b) redirect:客户端跳转(url会改变)
c) chain:服务器端跳转,跳转到一个action
d) redirectAction:客户端跳转
a) global-results(包内) | extends(继承其他包的result)
a) 在action中保存一个属性变量,存储具体的结果location;在配置文件用${变量}来访问值栈
a) 客户端跳转才需要传递
b) ${}表达式(不是EL)取action的valuestack;
<li>访问值栈中的action的普通属性: username = <s:property value="username"/> </li>
<li>访问值栈中对象的普通属性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>访问值栈中对象的普通属性(get set方法): <s:property value="cat.friend.name"/></li>
<li>访问值栈中对象的普通方法:<s:property value="password.length()"/></li>
<li>访问值栈中对象的普通方法:<s:property value="cat.miaomiao()" /></li>
<li>访问值栈中action的普通方法:<s:property value="m()" /></li>
<hr />
<li>访问静态方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>访问静态属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>访问List:<s:property value="users"/></li>
<li>访问List中某个元素:<s:property value="users[1]"/></li>
<li>访问List中元素某个属性的集合:<s:property value="users.{age}"/></li>
<li>访问List中元素某个属性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>访问Set:<s:property value="dogs"/></li>
<li>访问Set中某个元素:<s:property value="dogs[1]"/></li>
<li>访问Map:<s:property value="dogMap"/></li>
<li>访问Map中某个元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>访问Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>访问Map中所有的value:<s:property value="dogMap.values"/></li>
<li>访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<hr />
<li>投影(过滤):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
<hr />
<li>[]:<s:property value="[0].username"/></li>
a) property
b) set 设置变量,放到actioncontext中
c) bean
d) include(对中文文件支持有问题,不建议使用,如需包含,改用jsp包含)
e) param
f) debug
a) if elseif else
b) iterator
c) subset
a) theme
a) 补充
a) $用于i18n和struts配置文件
b) #取得ActionContext的值
c) %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用
a) 把所有主题定义为simple
b) fielderror特殊处理
c) 自己控制其他标签的展现
a) 原则:简单就是美
b) 库名:项目名
c) 表的命名:_Model名
d) 字段:保持和属性名一致(尽量不要起名和数据库命名冲突)
e) 用层来划分包com.bjsxt.bbs.action model(bean) service dto(vo)
f) Action XXXXAction
g) *-* struts2配置文件、jsp命名规则
h) / namespace命名
i) /admin
j) package “action” adminAction
a) 确定namespace
b) 确定package
c) 确定Action的名称,空的方法
d) 确定Result
e) 将界面原型页面进行修改,匹配现有设置
f) 测试
g) 做好规划!!!!!
a) 此时可以使用JUnit进行单元测试了
a) 实际上Struts2的大多数功能都由拦截器实现
a) ResourceBundle和Locale的概念
b) 资源文件
c) native2ascii
a) Action – Package – App级
b) 一般只用APP
c) PropertiesEditor插件
d) 动态语言切换
a) 见文档
a) acegi – spring security
a) 默认转换(url中参数转换为list,set,map等等)
b) 写自己的转换器:
public class MyPointConverter extends DefaultTypeConverter{
@Override
public Object convertValue(Object value, Class toType) {
if(toType == Point.class) {
Point p = new Point();
String[] strs = (String[])value;
String[] xy = strs[0].split(",");
p.x = Integer.parseInt(xy[0]);
p.y = Integer.parseInt(xy[1]);
return p;
}
if(toType == String.class) {
return value.toString();
}
return super.convertValue(value, toType);
}
}
public class MyPointConverter extends StrutsTypeConverter{
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
Point p = new Point();
String[] strs = (String[])values;
String[] xy = strs[0].split(",");
p.x = Integer.parseInt(xy[0]);
p.y = Integer.parseInt(xy[1]);
return p;
}
@Override
public String convertToString(Map context, Object o) {
// TODO Auto-generated method stub
return o.toString();
}
}
c) 三种注册方式:
d) 如果遇到非常麻烦的映射转换
a) namespace(掌握)
b) path(掌握)
c) DMI(掌握)
d) wildcard(掌握)
e) 接收参数(掌握前两种)
f) 访问request等(掌握Map IOC方式)
g) 简单数据验证(掌握addFieldError和<s:fieldError)
a) 结果类型(掌握四种,重点两种)
b) 全局结果(掌握)
c) 动态结果(了解)
a) # % $
a) 掌握常用的