Struts 2 + Hibernate 开发模式
Struts 2:以WebWork设计思想核心的新一代MVC框架:http://how2j.cn/k/struts/struts-tutorial/54.html神器不解析
Hibernate :对象关系映射框架
导入包WEB-INF文件下lib包中
配置文件名:Hibernate.xml
配置文件名:log4j.properties
配置文件:web.xml,编写过滤器
配置文件名:Struts.xml(必须要在src文件下创建)
1.下载Struts2资源包,把相关驱动包导入当前Web应用环境。
2.添加和配置struts2配置文件
3.配置Struts2启动项,Struts2核心控制器。
4.编写Action类
5.在struts.xml中配置action元素和结果视图。
6.编写JSP页面,运行部署和测试
在src包下创建cn.struts2下
dao(底层,impl()访问数据库)
service(业务逻辑类,impl()处理业务)
entity(实体,映射文件hbm.xml)
action(动作方法,一般都需要继承ActionSupprt类,表单提交数据时一般都定义相同的name属性来自动映射接收值)
utils(工具类,openSession,正向工程)
client(测试方法类)
struts.xml中:
1.创建Action类,编写接收值(参数或对象)的get,set,无参,带参方法和业务处理方法.
2.业务处理方法返回值要明确!如:success或者input或者error等,需要在struts.xml中做好对应的处理
3.表单提交或者访问Action类自动带方法传递.. 具体参考 <-- 项目中的文件
UI标签:在页面上导入:<%@taglib uri="/struts-tags" prefix="s"%>
EL标签不需要引入什么,JSTL标签则是: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
UI标签: 1.表单标签:<s:form...>,<s:textfieid.../>
2.非表单标签:暂时不讲
3.Ajax标签:暂时不讲
通用标签:<s:if><s:elseif><s:else><s:iterator>跟逻辑相关
用法: 在JSP页面都有例子.查看一下就行!书中P57页解
Servlet API:作用域(Session,request,application),保存Object类型
IOC 依赖注入:实现 接口 implements ApplicationAware,RequestAware,SessionAware(参考:UserLoginAction)
解耦: ActionContext ac = ActionContext.getContext();
Map<String, Object> requestMap = (Map<String, Object>) ac.get("request");
Map<String, Object> applicationMap = ac.getApplication();
Map<String, Object> sessionMap = ac.getSession();
耦合:HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = ServletActionContext.getRequest().getSession();
ServletContext application = ServletActionContext.getServletContext();
用法:保存值:.put(key,value) 取值:.get(key)
Action:方法调用有两种方式
1.动态调用:actionName!+方法名称.action(控制器!指定访问的方法,中间使用感汉号隔开)
第一步:在struts.xml配置所有功能action元素
第二步:配置struts2常量,显示允许动态方法调用
第三步:actionName!actionMethod
例如提交时访问登录方法:user!login.action (提交表单时使用,一般都用通配符方式)
另一种:比上面的还有简单的实现方法,外加了一点通配符的方式
把属性改:method="{*}",访问提交表单的时候:loginUsers!+方法名称.action
2.通配符调用:例如提交时访问登录方法:loginUsers
Action的Name属性:*User(*匹配所有,获取的是*表示:login,只是获取User之前的)
method="{1}"({1}表示占位符的意思吧,此時占位符获取的方法就是login())
好像有点解析不清楚看一下例子就好 <-- Struts.xml中有使用
另一种: 第一个*值:{1}第二个*值:{2}
<action name="*_*" class="cn.struts2.action.{1}Action" method="{2}">
<result name="{1}_{2}">/{1}_{2}.jsp</result>
表单调用时:Action_方法名称!+方法名称.action
作用:1.封装单元(处理请求数据)2.数据转移(get,set方法)3.返回结果
配置默认的Action:<default-action-ref name="defalutAction"/>
作用:如果没有匹配到其他ACtion的时候,默认的Action会自动执行
Result(接收Action方法中返回的值)配置:
返回值:1.input(重新输入)
2.error(有错误,一般打开这个页面显示内容都是升级系统什么的,巴拉巴拉你都懂的.(意思就是代码没错,要错也是因为系统升级的原因!嗯,就是系统升级!))
3.success(成功之后)
4.也可以默认不写,那就是返回的时候值找不到以上属性会默认打开某个页面,例子看一下Struts.xml就懂
5.也可以自定义一些返回值再执行.一般是(input_+方法名) 和(success_+方法名)
打开页面的Type类型有3种:
1.dispatcher:转发到某个页面,请求中的数据不会丢失!
2.redirect:重定向打开一个页面,请求中的数据会丢失!默认好像就是这货
3.redirectAction:采用重定向打开一个新的Action!!,原请求的数据信息会丢失!
OGNL:对象导航图语言是一种可以方便地操作对象属性的开源表达式语言,主要负责两件事:表达式语言和类型转换器
“%”、“#”、“$”这三个符号的使用:http://www.blogjava.net/parable-myth/archive/2010/10/28/336353.html 详解..
大致就是:
符号:“#”用来取根目录下的值,例如 session,request等等,取值的时候#session.key.属性名 ,这样会取到想要的对象的属性值。
符号:“%”用于OGNL标签嵌套时候用的,比如想把一个对象的值赋值给另外一个对象:<input type="hidden" name="UserAId" value="<s:preperty value=“%UserB.id” ">
符号:“$”就是 EL表达式辣...
OGNL表达式:
1.访问Bean属性:支持对象属性调用,形式如:objName.propertyName();意思是:user.name 可以在页面上输入值:类似EL表达式的用法
用法:用户姓名:<s:property value="user.name" />
2.访问集合对象:书中P124页有详解..太多了直接看书吧!
自定义转换类型:需要继承StrutsTypeConverter,同时需要重载以下两个方法:
1.public Object convertFromString(Map context,String[] values,Class toType)
将一个或多个字符串值转换为指定的类型,context:OGNL的上下文对象|values:要转换的字符串|toType:转换的目标类型
2.public String convertToString(Map context,Object object)
将指定对象转化为字符串:context:OGNL的上下文对象|object:要转换的对象
注意配置:全局范围的类型转换器:Src包下创建一个名为 :xwork-conversion.properties的属性文件(全局的!)
创建一个名为:*Action-conversion.properties(指定的!)
内容为:转换的类全名 = 类型转换器全名( 参考吧!项目中有 )
用法:编写类型转换器:TypeConverter(这里案例为日期类型的转换)放在utils工具包下
<s:debug>:struts2提供了一个非常好的调试方法.就是在页面上添加一个debug标签..它会自动帮我们将一些信息显示在页面上.
用法:就是在页面多写一个标签就行了..
Struts标签:可以直接理解为语法“%{···}”
注意:Struts标签属性都可使用OGNL表达式,例如:<s:set>,<s:property>的value属性都为Object类型,
如果要访问动态属性则必须使用%{'~~'}这样的语法!
Url标签:访问指定地址时传值
注意:Struts2中不推荐使用el表达式!
用法:<s:url action="User"> 指定请求地址
<s:param name="id" value="123"></s:param> 指定参数
</s:url>
<s:a href="%{url}">测试</s:a>
结果为:<a href="User?id=123">
数据校检:出现错误一般返回的是'input'结果,留意在struts.xml中配置好
用法: validate()表示校检全部
validate+大写开头方法体表示校检指定的方法。例子在:UsersManageAction.java中参考
一般都需要继承ActionSupprt类,同时自动生成序列号
这样才能使用addFiledError(key,value)(保存错误信息)
读取错误信息有两种方式:
1.指定: jsp页面上 <s:fielderror theme="" fieldName="key"/>
2.全部输出: jsp页面上 <s:fielderror />
Struts 2的验证框架:将常用的验证规则进行编码实现,在配置文件中指定某个字段需要进行的验证类型,并提供出错的信息即可
先参考书中P141页的内置校检器
用法:编写验证文件与校检规则
1.验证文件要和验证的Action文件放在同一个包下
2.采用指定的方式命名:ClassName-validation.xml (注意这是:验证整个Action)
或者:ClassName-alias-validation.xml(注意这是:验证整个Action中的指定提交Action方法)
(ClassName是Action的类名,alias表示在Struts中配置的Action名字)
3.例如:UsersManageAction-validation.xml(参考项目就有例子,在Action包下)
国际化: 其实就是用户选择用什么语言,页面自动完成切换语言的功能,符合国际化的概念(i18n=Internationaliztion(这由来..就是i开头n结尾一共18个字母组成))
用法:1.struts.xml文件中加入:<constant name="struts.custom.i18n.resources" value="message" />
2.在与struts.xml文件的同目录下创建文件: ① message_en_NZ.properties (切换为英文)
②message_zh_CN.properties (切换为中文) 同理当然也可以添加多个..( 直接参考项目吧!,反正文件名不能错 )
3.在JSP页面中使用过Struts标签完成界面内容 login.jsp 用使用的方法:<a href="language?request_locale=zh_CN">中文显示</a>
令牌机制:防止用户因网络延时而多次点击提交数据时反复多次访问服务器
用法: 1.表单中添加属性:<s:token>
2.Struts.xml中需要验证重复提交action中加入验证拦截器
<interceptor-ref name="token"/>
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="invalid.token">/error.jsp</result>
注意:在Struts.xml文件中使用其他(所有)拦截器的时候必须再调用一次默认的拦截器,不然会出现一个非人类的问题
案例在:login.jsp页面中有
拦截器:是Action执行之前或之后进行一些处理,AOP思想.是Struts体系结构的核心!
作用于:页面请求传递,数据封装,国际化,类型装换,上传文件等等等...拦截器和过滤器的思想是完全一致..
流程:请求(页面-->过滤器-->拦截器1-->Action-->拦截器1-->返回页面).在之前或在之后都经过拦截器
配置详解:启动Tomcat的时候也会自动启动拦截器
两种实现方式:
用法1:继承AbstractInterceptor类,重写intercept方法!P92页有参考。
用法2:创建类实现接口:Interceptor(xwork2下的包)自动生成3个方法
太多了...需要的时候再参考:http://www.jikexueyuan.com/course/1668_3.html?ss=1
注意:在Struts.xml文件中使用其他(所有)拦截器的时候必须再调用一次默认的拦截器,不然会出现一个非人类的问题
定义拦截器:在<package>包下
<interceptors>
<interceptor name="" class=""></interceptor>
</interceptors>
引用方式:<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="自定义的拦截器名字" ></interceptor-ref>
注意:在Struts.xml文件中使用其他(所有)拦截器的时候必须再调用一次默认的拦截器,不然会出现一个非人类的问题
内置的拦截器: params(将请求中的数据设置到Action属性上)拦截器
staticParams(将配置文件中通过action元素的子元素param设置的参数到对应的Action属性中)拦截器
servletConfig()拦截器
使用Struts 2实现文件上传:用户在页面上通过<s:file>选中文件,自动把文件上传到Tomcat服务器中保存..
用法: 1.添加jar包:commons-fileupload-1.3.jar 和 commons-io-2.0.1.jar
2.在页面上<s:from>中指定加入属性:enctype="multipart/form-data"
表单中包含:<s:file name=“upload”>,其中name属性必须对应Action类中定义的name才能取值!
3.配置Struts 2配置文件:为其添加一个action动作方法
4.编写UpLoadFileAction类:使用文件流方式输入输出,再返回结果在XML中判断.
(upload文件内容,uploadFileName文件名称,uploadContentType文件类型和uploadPath保存路径)
单个上传:定义字符串接收值
多个上传:定义数组接收值+for循环实现
配置上传文件大小:在Struts.xml中加入:
使用Struts 2实现文件下载:需要指定一个输入流,即是InputStream,通过这个流就可以实现文件下载功能
用法: 1.创建显示图片的网页给出访问Action的连接:<a href="fileDownLoadAction?fileName=<s:property value='#fileName' />">请下载<s:property value='#fileName' /></a>
2.编写FileDownLoadAction类(具体属性参考项目,重点)
3.在Struts.xml中配置结果和参数(具体属性参考项目,重点,可参考书上P104页详解)
塔么的,中文会乱码.
参考1:http://blog.csdn.net/csh624366188/article/details/6695702
在FileDownLoadAction.java中fileName的set属性改为:
// 转换格式
this.fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
参考2:直接修改Tomcat中的配置文件
http://zhidao.baidu.com/question/227896210.html?qbl=relate_question_0&word=jsp%D2%B3%C3%E6%D4%F5%C3%B4%B4%F2%B2%BB%BF%AA%D6%D0%CE%C4%C3%FB%B3%C6%CD%BC%C6%AC