Struts是基于MVC设计模式的框架技术,现在的流行使用是struts1.1 and struts1.2,使用开发框架可以更好地提高开发效率。
Struts的工作流程
1.
检索和用户请求匹配的ActionMapping实例,如果不存在,就返回用户请求中路径无效的信息。
2.
如果ActionForm实例不存在,就创建一个ActionForm对象,把客户提交的表单数据保存到ActionForm对象中。
3.
根据配置信息决定是否需要表单验证。如果需要验证,就调用ActionForm的validate()方法。
4.
如果ActionForm的validate()方法返回null或返回一个不包含ActionMessage的ActionErrors对象,就表示表单验证成功。如果返回一个或多个ActionMessage的ActionErrors对象,就表示表单验证失败,此时ActionServlet将直接把请求转发给包含用户提交表单的jsp组件。在这种情况下,不会创建Action对象和调用Action的execute()方法。
5.
ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。如果相应的Action实例不存在,就先创建这个实例,然后调用Action的execute()方法。
6.
Action的execute()方法返回一个ActionForward对象,ActionServlet再把客户请求转发给ActionForward对象指向的jsp组件.
7.
ActionForward对象指向的jsp组件生成动态网页,返回给客户。
如何用好struts框架技术呢?我们应该掌握如下的知识点:
Ø
MVC的两种规范
Ø
配置文件(struts-config.xml,web.xml)
Ø
ActionForm类及其子类。
Ø
ActionForward类
Ø
ActionServlet类
Ø
Action类
Ø
ActionMessages类
Ø
国际化的问题
Ø
struts验证技术
Ø
struts标签
Ø
struts扩展(略)
Ø
struts与hibernate结合使用
逐个击破
MVC的两种规范
两种MVC规范是JSP Model1and JSP Model2.
假设访问我们分这么几部分:浏览器,WEB服务器,应用服务器和数据库,两者不同的是JSP Model1 WEB服务器里面只有JSP页面和JavaBean,JSP既充当V,又充当C的角色。而JSP Model2的WEB服务器里有JSP、JavaBean和Servlet。
配置文件(struts-config.xml,web.xml)
web.xml文件。
配置ActionServlet(<servlet>,<servlet-mapping>)
初始化ActionServlet的初始化参数(<init-param>也就是加载struts-config.xml)
配置欢迎文件(<welcome-file-list>)
配置错误处理
<error-page>
<error-code>404</error-code>
<location>/common/404.jsp</location>
</error-page>
配置struts标签库(<tablib>)
struts-config.xml
配置数据库连接(<data-sources>)
配置实体(<form-beans>)
配置全局的异常处理(<globel-exceptions>)
配置全局的转发关系(<globel-forwards>)
配置映射(<action-mapping>)
配置本地化文件(<message-resources>)实际是为了完成国际化。
配置插件(<plug-in>)(略)
ActionForm类及其子类。
DTO数据传输对象,生命周期有两种request and session,ActionForm有validate()和reset()方法,主要说reset()方法,针对于request 级的ActionForm类是没有很大含义地,因为它只会被调用一次,里面封装的数据也只是一次使用。主要是对于session级的作用是很大的,因为它涉及到多次用到。
DynaActionForm是ActionForm子类,有initialize()方法,实现DynaActionForm的方法:
<form-beanname=”loginForm”type=”org.apache.struts.action.DynaActionForm”>
<form-propertyinitial=”alex”name=”userName”type=”java.lang.String”/>
</form-bean>
两种ActionForm做比较.
初始化:DynaActionForm是通过实现化,然后覆盖其父类的方法reset()在这个方法中
调用initilize()进行初始化。
验证:DynaActionForm采用动态的验证方法,在(struts验证技术中会说到)
使用:DynaActionForm的所有属性保存在一个Map类中,通过get(),set()方法调用,
如:String email=(String)form.get(“email”);
ActionForward类
(略)
ActionServlet类
属于struts控制器组件,包括:ActionServlet,RequestProcessor and Action.
组件完成的任务:
接收用户请求、根据用户请求,调用合适的模型组件来执行相应的业务逻辑、获取业务逻辑执行结果、根据当前状态以及业务逻辑执行结果,选择合适的视图组件返回给用户。
Struts采用ActionServlet和RequestProcessor组件进行集中控制,并采用Action 组件来处理单项业务。
ActionServlet类在应用生命周期中只创建实例一次。
Action类
Action类是用户请求和业务逻辑之间的桥梁。在RequestProcessor类预处理请求时,在创建了Action的实例后,就调用自身的processActionPerform()方法,该方法再调用Action类的execute()方法。
ActionMessages类
ActionError类是ActionMessage的子类,struts1.2放弃ActionError.
国际化的问题
application_zh.properties保存一些信息。
如:error.loginFail=”登录失败,请输入正确的用户名和密码”
ActionMessages errors=new ActionMessages();
Errors.add(“loginfail”,new ActionMessage(“error.loginFail”));
关于乱码的问题:
1.如果一些网站服务器例如Tomcat 如果遇到中文乱码问题,可以修改conf目录下的server.xml
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100" debug="0"connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
URIENcoding 设成GBK或GB2312
2.表单中或传递字符串:本来输入的汉字是正常的,但是提交后再显示出来是乱码,因为提交的一般是 ISO8859编码,所以显示的时候要转成GB2312编码: String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//rs为待转换的字符串
然后使用S字符串的值就可以了
3.有的服务器端的语言环境如果设成简体中文的也可以解决此类问题
4.插入数据库中的字符是乱码
看看数据库中支持的是何种编码方式,用类似2中的方式作一下转换即可。
5.总之,用jsp开发,碰到乱码,你得分析是读的时候发生乱码,还是写的时候发生乱码,用2中的转换,基本就能解决问题,有些时候写的时候做一次转换,例如:
String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//读的时候在转换回来
String S=new String(rs.getString("news").getBytes("ISO8859_1"),"GB2312");
或者把ISO8859-1和GB2312 的位置换一下,自己多试试,就能找到解决问题的办法。
struts验证技术
前面已讲在ActionForm中validate()验证。这里主要说在配置中验证技术。所需文件validation.xmlvalidator-rules.xml优点:当相同的验证逻辑时,可提高代码的可重用性
struts标签
struts-bean.tldstruts-form.tldstruts-html.tldstruts-logic.tldstruts-nested.tldstruts-template.tldstruts-tiles.tld 七个标签文件。
struts HTML标签
基本的标记
struts Bean标签
用于定义输入输出javaBean
struts Login标签
逻辑运算、循环遍历
struts Nested标签
定义javaBean嵌套关系