操作手册_MyEclipse前言假如你的人生有理想,那么就一定要去追,不管你现在的理想在别人看来是多么的可笑,你也不用在乎,人生蹉跎几十年,如果年轻的时候计较得失前怕狼就后怕虎而不去追逐,等到了40,50岁的时候,你唯一能做的就是感叹岁月的消逝和无情…
实验软件下载- 下载struts2.1.6http://struts.apache.org/download.cgi#struts217(选择下载fulldistribution)
- 下载myeclipse,http://www.myeclipseide.com
- 下载tomcat,http://tomcat.apache.org
- 下载xwork,http://www.opensymphony.com/xwork(要注意的是下载与struts2.1.6的对应版本,即2.1.2)
安装与设置- 解压struts2.1.6,假设解压后位于d:/struts2目录
- 安装MyEclipse,任何版本都可以
- 假设你已经安装好jdk和tomcat了,如d:/tomcat
HelloWorld- 建立项目
- 打开eclipse
- 新建项目
- 选择myeclipse-javaenterPRiseprojects-webproject
- 项目名称:struts2_0100_introduction
- 选择javaee5.0
- 设定server
- window–preferences–myeclipse–servers–tomcat–6.x
- 选择tomcathomedirectory
- 选择enable
- finish
- 设定jdk环境
- window–preferences–java–installedjres
- 如果没有对应的JDK(不是JRE),选择add
- 选择standardVM->next
- 选择JDK对应的Directory
- 将刚刚设定的JDK设为默认
- 建立第一个struts2.1的程序
- 找到struts目录下对应的apps目录
- 解压struts2-blank-2.1.6.war
- Copy对应的lib的jar文件,需要除junit和spring-test之外的所有文件,其中commons-io的jar包会在文件上传和下载时需要,其他为必须
- Copy对应的struts.xml到src目录,在packageexplorer视图进行操作
- 注释掉struts.xml的多余内容
- 建立HelloStruts2_1.jsp文件
- *修改jsp文件的默认编码属性window-preferences-web-jspfiles-设为Chinese,NationalStandard
- 在struts.xml中照原配置进行对应的配置
- 修改对应的web.xml,建立struts2的filter(参考struts自带的项目)
- 运行项目
- 可以首先部署到tomcat上项目
- 也可以项目右键debugas–myeclipseserverapp,选择刚刚建立好的server
- 其他
- 学习建立struts的dev-mode,好处在于我们修改了配置文件的时候能够自动热替换
- 建立jar文件对应的源码D:/share/tools/struts-2.1.6/src/core/src/main/java,以及xwork对应的源码,以及对应的javadoclocation,(更好的方式是建立自己的user-library)
- 浏览struts的目录
- 认识eclipsejee的项目部署目录,认识如何修改webapp的context-root,项目copy改名后可能会出现的问题
- packageexplorer–建立jar的源文件和目标关联,navigator–观察所有的内容
- 认识Action的后缀名,在struts2默认中,带不带action都可以
常见问题:- struts.xml不自动提示
- window–preferences–搜索catalog–add
- 选择keytype为URI
- key:http://struts.apache.org/dtds/struts-2.0.dtd
- 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
- 导入示例项目
- 注意JDK的版本,应该是JDK6,否则会出classversion的问题
- 如果总是项目出问题,可以重建项目,单独拷文件
- 还有一种情况是项目右键,properties–java–compiler选择6.0
- 另外,在tomcat配置中也要使用jdk6
- devMode设为true就会出问题空指针问题
- tomcat路径带了空格
- 在使用ActionContext.getContext().get(“request”)取不到对象,为null值
- web.xml不要使用2.0的filter,用新的
- 在action的试验中,遇到一个奇怪的bug
- 用default-action-ref指定一个action
- 用*_*映射
- 在地址栏中访问一个不存在的action,如adfsdfsfs
- 结果居然会映射到*_*上
- 如果换成*__*就没问题了
- 靠,只能认为是bug
- 下次用*-*,不用*_*
学习方法说明- 先阅读老师的代码
- 再建立自己的项目进行动手学习
Action- 实现一个Action的最常用方式:从ActionSupport继承
- DMI动态方法调用!
- 通配符配置*{1}{2}…
- *_*
- 接收参数的方法(一般用属性或者DomainModel来接收)
- 简单参数验证addFieldError
- 一般不使用Struts2的UI标签
- 访问Web元素
- Map类型
- IoC
- 依赖Struts2
- 原始类型
- IoC
- 依赖Struts2
- 包含文件配置
- 默认action处理
Result- 常用四种类型:
- dispatcher(默认)
- redirect
- chain
- redirectAction
- 全局结果集
- global-results|extends
- 动态结果(了解)
- 在action中保存一个属性,存储具体的结果location
- 传递参数
- 客户端跳转才需要传递
- ${}表达式(不是EL)
OGNL- ObjectGraphNavigationLanguage
- 想初始化domainmodel,可以自己new,也可以传参数值,但这时候需要保持参数为空的构造方法
- 其他参考ognl.jsp
- 什么时候在stack中会有两个Action?chain
Struts-Tags- 通用标签:
- property
- set
- 默认为actionscope,会将值放入request和ActionContext中
- page、request、session、application
- bean
- include(对中文文件支持有问题,不建议使用,如需包含,改用jsp包含)
- param
- debug
- 控制标签
- ifelseifelse
- iterator
- collectionsmapenumerationiteratorarray
- subset
- UI标签
- theme
- simplexhtml(默认)CSS_xhtmlAjax
- AJAX标签
- 补充
- $#%的区别
- $用于i18n和struts配置文件
- #取得ActionContext的值
- %将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用
- 参考<s:property和<s:include
定义自己的theme- css(覆盖struts2原来的css)
- 覆盖单个文件
- 定义自己的theme
- 实战:
- 把所有主题定义为simple
- fielderror特殊处理
- 自己控制其他标签的展现
作业- 读doc文档:struts-tags
- 设计约定(编码规定)
- 原则:简单就是美
- 库名:项目名
- 表的命名:_Model名
- 字段:保持和属性名一致(尽量不要起名和数据库命名冲突)
- 用层来划分包com.bjsxt.bbs.actionmodel(bean)servicedto(vo)
- ActionXXXXAction
- *-*
- /
- /admin
- package“action”adminAction
项目开发顺序-以BBS2009的名义- 建立界面原型
- 建立Struts.xml
- 确定namespace
- 确定package
- 确定Action的名称,空的方法
- 确定Result
- 将界面原型页面进行修改,匹配现有设置
- 测试
- 做好规划!!!!!
- 建立数据库(或者实体类)
- 建立Model层
- 建立Service层(后面讲了Hibernate后再完善)
- 此时可以使用JUnit进行单元测试了
- 着手开发
声明式异常处理- 在Actoin中进行异常映射
- 在package中进行全局异常映射
- 使用继承共用异常映射
- Struts2中异常处理由拦截器实现(观察struts-default.xml)
- 实际上Struts2的大多数功能都由拦截器实现
I18N- I18N原理
- ResourceBundle和Locale的概念
- 资源文件
- native2ascii
- Struts的资源文件
- Action–Package–App级
- 一般只用APP
- struts.xmlcustom.i18n
- PropertiesEditor插件
- 解压
- featuresplugin覆盖到myeclipse中的eclipse目录里
- 动态语言切换
- request_locale=en_US
Struts拦截器以及源码解析- Struts架构图
- 见文档
- Struts执行过程分析
- Interceptor拦截器过程模拟
- 定义自己的拦截器
- acegi–springsecurity
- 使用token拦截器控制重复提交(很少用)
- 类型转换
- 默认转换
- 日期处理
- 写自己的转换器:
publicclassMyPointConverterextendsDefaultTypeConverter{
@Override
publicObjectconvertValue(Objectvalue,ClasstoType){
if(toType==Point.class){
Pointp=newPoint();
String[]strs=(String[])value;
String[]xy=strs[0].split(",");
p.x=Integer.parseInt(xy[0]);
p.y=Integer.parseInt(xy[1]);
returnp;
}
if(toType==String.class){
returnvalue.toString();
}
returnsuper.convertValue(value,toType);
}
}
publicclassMyPointConverterextendsStrutsTypeConverter{
@Override
publicObjectconvertFromString(Mapcontext,String[]values,ClasstoClass){
Pointp=newPoint();
String[]strs=(String[])values;
String[]xy=strs[0].split(",");
p.x=Integer.parseInt(xy[0]);
p.y=Integer.parseInt(xy[1]);
returnp;
}
@Override
publicStringconvertToString(Mapcontext,Objecto){
//TODOAuto-generatedmethodstub
returno.toString();
}
}
- 三种注册方式:
- 局部:XXXAction-conversion.properties
- p(属性名称)=converter
- 全局:xwork-conversion.properties
- com.xxx.XXX(类名)=converter
- Annotation
- 如果遇到非常麻烦的映射转换
- request.setAttribute();
- session
补充视频中讲解的内容- Lambda表达式
- 验证框架
- UI标签
- 类型转换中的异常处理
- 上传与下载文件
- Struts2注解
Struts2总结- Action
- namespace(掌握)
- path(掌握)
- DMI(掌握)
- wildcard(掌握)
- 接收参数(掌握前两种)
- 访问request等(掌握MapIOC方式)
- 简单数据验证(掌握addFieldError和<s:fieldError)
- Result
- 结果类型(掌握四种,重点两种)
- 全局结果(掌握)
- 动态结果(了解)
- OGNL表达式(精通)
- #%$
- Struts标签
- 掌握常用的
- 声明式异常处理(了解)
- I18N(了解)
- CRUD的过程(最重要是设计与规划)(精通)
- Interceptor的原理(掌握)
- 类型转换(掌握默认,了解自定义)