📄 14. struts1.x note.txt
字号:
Day1:
overview:
1.MVC概述
2.Struts框架 (技术概览)
3.Struts开发步骤
4.Struts新手上路
5.Struts详解
6.使用工具构建struts应用
**************************************************************
一 MVC概述 (教材Page 219)
1 起源
2 设计理念
图(Page 219)
Controller:
Model:
View:
3.分层设计对Model的影响
4.Web MVC的发展(Page 221 ~ 227)
Model1 ---> Model2 ---> Framework
1)Model1的特点(Page 222)
2)Model2的特点(Page 224)
3)Framework的引入(Page 226)
引入框架的作用
A. 使得功能组件松散耦合,甚至可配置
B. 提供公用的服务:
例如:i18n,安全,表单的重复提交,文件上传……
C. 简化开发模型——使得开发人员的精力集中在业务逻辑之上
框架的分类
A.设计的思路
白盒框架:使用时,需要了解其内部结构(extends);入侵性框架
黑盒框架:不需了解其代码细节,最多实现其接口;非入侵性框架
B.功能、作用
Web:Strusts1.x, WebWork, Strusts2.x(发展1.x和webwork), JSF(抗衡.net), Tapestry,
Shale, ZK, Echo, (根本全是Servlet规范) ……
Business:Spring, Seam
Persistence(持久层):Hibernate, Toplink, OpenOJB, ……
评价框架的优劣?
A.设计理念 先进?
B.编程模型 简单?
C.是否拥抱规范、标准?
D.社区是否庞大?第三方的支持程度?
程序设计思路
可维护性:预见需求(预见多年后的事)
可重用:
代码可重用(最低级别):粒度:方法(常用代码块),类,包,组件(类库)
设计的可重用:框架(半成品,如Hibernate);产品(开发软件);算法、设计模式
分析的可重用(最高级别,见不到代码):文档、规范、标准(ISO:CMM,CMMI)
可扩展性:
*****************************************************
二、Struts框架 (技术概览)
1.Struts简介
Apache
OpenSource
官方网站:http://jakarta.apache.org
MVC
Servlet, JSP, 资源文件, 定制标签库
Struts框架的位置
2.Struts快速上手
需求描述:
系统的登录
开发步骤
1) 创建项目、搭建环境
下载Struts开发包
把%STRUTS_HOME%/lib/*.jar拷贝到WEB-INF/lib
把%STRUTS_HOME%/contrib/struts-el/lib/*.jar拷贝到WEB-INF/lib
把%STRUTS_HOME%/lib/*.tld拷贝到WEB-INF(新版本无需这么做)
将%STRUTS_HOME%/contrib/struts-el/lib/*.tld 拷贝到WEB-INF(新版本无需这么做)
2) 配置WEB-INF/web.xml文件
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
3) 在WEB-INF创建struts-config.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<form-beans />
<global-exceptions />
<global-forwards />
<action-mappings />
<message-resources parameter="com.yourcompany.struts.ApplicationResources" />
</struts-config>
4) 提供login.jsp
引入struts标签库
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<html:form action="/login">
<table>
<tr>
<td>用户名:</td>
<td><html:text property="username"></html:text></td>
</tr>
<tr>
<td>密 码:</td>
<td><html:password property="password"></html:password></td>
</tr>
<tr>
<td colspan=2 align=center>
<html:submit value="登录"></html:submit>
</td>
</tr>
</table>
</html:form>
5) 提供Form Bean
com.form.LoginForm
public class LoginForm extends ActionForm {
private String username;
private String password;
//getter, setter
}
配置文件更新:
<form-beans>
<form-bean name="loginForm" type="com.form.LoginForm"></form-bean>
</form-beans>
6) 提供action:LoginAction extends Action
public class LoginAction extends Action {
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginForm loginForm = (LoginForm)form;
String username = loginForm.getUsername();
String password = loginForm.getPassword();
boolean isLogin = false;
if("maxwell".equals(username) && "123".equals(password)) {
isLogin = true;
}
if(isLogin) {
return mapping.findForward("success");
} else {
return mapping.findForward("error");
}
}
}
配置文件更新:
<action-mappings>
<action path="/login" type="com.action.LoginAction" name="loginForm">
<forward name="success" path="/success.jsp"></forward>
<forward name="error" path="/error.jsp"></forward>
</action>
</action-mappings>
3.Struts技术详解
1) struts的MVC模型 (Page229)
2) 主要组件详解
1)ActionServlet
继承HttpServlet类,需要在web.xml中配置
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2)Action
开发人员必须继承这个Action类,供ActionServlet所驱动。
职责:调用业务逻辑方法
将控制权返回给ActionServlet并且提供相关的路由信息
public class LoginAction extends Action {
......
}
步骤:
(1) 继承Action类。
(2) 覆盖 execute(...)方法。
(3) 返回ActionForward对象 (提供决策信息给ActionServlet选择适当的视图响应用户) 。
(4) 在struts-config.xml中配置
<action-mappings>
<action input="/index.jsp" :ActionForm验证失败的跳转页面
name="aForm" :与Action对应的FormBean对象
path="/myAction" :请求URI(/myAction.do)
scope="session" :FormBean作用域范围
type="action.LoginAction" :自定义的Action类
validate="true" :FormBean是否调用validate(...)方法
>
<forward name="success" path="/success.jsp" /> :成功跳转的页面
</action>
......
</action-mappings>
注:scope的值可以是request和session,默认是session
3)ActionForm:封装HTTP请求中的数据
将用户提交的数据自动填充(在相应的action的execute方法被调用之前)到form的属性中
无需手工调用request.getParameter(…)
开发人员必须继承这个ActionForm类
public class LoginForm extends ActionForm {
......
}
3) 处理流程(程序中的关系)
****************************************************************************
三、使用IDE工具生成struts项目
Day2:
1 视图选择
2 国际化
3 Struts中的异常处理
4 动态表单
5.标签库
*************************************************************************
1 视图选择
局部转发与全局转发(优先级:局部转发的优先级比全局转发的优先级高)
1) 局部转发:只对某个Action可见
<action ...>
<forward name="success" path="/success.jsp" />
</action>
2) 全局转发:对所有的Action可见(共享)
<global-forwards>
<forward name="success" path="/globalsuccessful.jsp"></forward>
</global-forwards>
例子:
把登录例子中的成功跳转设置为全局转发。
2 I18N
I18N解决办法
创建多个资源文件,根据用户设置选择不同资源文件
ApplicationResources.properties
ApplicationResources_en.properties
ApplicationResources_zh.properties
资源文件:
用于映射页面中的静态信息、按钮标签、错误信息等,
通过一个属性文件(.properties) 把所有页面的静态信息集中在一起,便于修改。
例子:
编写资源文件的步骤:
1) 编辑资源文件
login_en.properties
login.title=Login Page
login.success=Congratuation! You successfully login our System!
login.username=User Name
login.password=Password
添加对中文的支持txt:
login.title=登录页面
login.success=恭喜你!你已经成功登录我们的系统了!
login.username=用户名
login.password=密码
login.submit=登录
转换本地编码为Unicode:
native2ascii login.txt login_zh.properties ----->生成login_zh.properties文件
login.title=\u767b\u5f55\u9875\u9762
login.success=\u606d\u559c\u4f60\uff01\u4f60\u5df2\u7ecf\u6210\u529f\u767b\u5f55\u6211\u4eec\u7684\u7cfb\u7edf\u4e86\uff01
login.username=\u7528\u6237\u540d
login.password=\u5bc6\u7801
login.submit=\u767b\u5f55
2)在struts-config.xml文件中配置资源文件<message-resources parameter="login" />
3)在JSP文件中使用<bean:message key="login.title"/>标签输出资源文件中的值
4)演示效果:
修改浏览器的设置
英文界面少写了"login.submit";则是找出中文的
3 Struts中的异常处理
java class: try/catch/finally/throws/throw/custom Exception class
jsp: page指令 + web.xml配置<error-page>
struts: try/catch/finally/throws/throw/custom Exception class
声明方式(*)------->struts-config.xml
定制异常处理器(*)
ActionErrors(或ActionMessages):异常的集合类
ActionMessage:具体异常类
关系图
方法一:
在actionform的validate方法中处理(很少使用,一般用验证框架实现用户输入合法性验证)
(1)重写action form的validate方法
@Override
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if(username == null || username.equals("") || username.length() > 50) {
ActionMessage msg = new ActionMessage("error.username");
errors.add("errorusername", msg);
}
return errors;
}
login_en.properties的内容
error.username=Please input the correct user name!
login_zh
error.username=请输入正确的用户名信息!error.username=\u8bf7\u8f93\u5165\u6b63\u786e\u7684\u7528\u6237\u540d\u53ca\u5bc6\u7801\uff01
(2)配置struts-config.xml文件
在action标记内添加一个input属性和validate属性
其中,
input属性的值-----表示发生错误后跳转到的页面
validate属性的值-----表示ActionServlet是否去执行ActionForm的validate(...)方法,并且这个属性默认值是true
<action-mappings>
<action name="loginForm"
path="/login"
type="com.action.LoginAction"
input="/login.jsp"
validate="true">
<forward name="fail" path="/fail.jsp"></forward>
</action>
</action-mappings>
(3)在login.jsp页面中加入<html:errors/>输出错误。
方法二:
在action的execute方法中处理(极少使用,知道这种方法就可以了)
(1)在action的execute方法中写错误处理的代码(和action form里valdiate方法的代码基本一致)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -