第14章struts2基础0612.docx
《第14章struts2基础0612.docx》由会员分享,可在线阅读,更多相关《第14章struts2基础0612.docx(23页珍藏版)》请在冰豆网上搜索。
第14章struts2基础0612
【Struts介绍】
●最早作为ApacheJakarta项目的组成部分
●Jakarta:
雅加达,印度尼西亚的首都,爪哇(Java)岛上的第一大城市
●Jakarta是Apache组织下的一套Java解决方案的开源软件的名称,它包括了很多子项目
●Tomcat、Ant、Struts等現在是Apache下的开源项目,也曾是Jakarta的关联项目
●Struts这个名字来源于在建筑和旧式飞机中使用的支持金属架
●当建立一个物理建筑时,建筑工程师使用支柱为建筑的每一层提供支持。
同样,软件工程师使用Struts为业务应用的每一层提供支持
●它的目的是为了帮助我们减少在运用MVC设计模型来开发Web应用的时间
●ApacheStruts是为创建JavaWeb应用程序而提供的一个开源的框架。
14.1.1MVC原理
●视图View:
视图是用户看到并与之交互的界面。
●模型Model:
模型表示企业数据和业务规则。
在MVC的三个部件中,模型拥有最多的处理任务。
●控制器Controller:
控制器接受用户的输入并调用模型和视图去完成用户的需求。
●MVC的处理过程:
首先控制器接收用户的请求,并决定应该调用哪个模型来进行处理,然后模型用业务逻辑来处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过表示层呈现给用户。
(1)早期Java开发Web应用
(2)Model1—JSP充当了V和C
(3)Model2
模型M——JavaBean
视图V——JSP页面
控制器C——Servlet
●视图层采用JSP实现
●控制层采用Servlet实现,整个框架采用同一个Servlet,以实现请求的中转
●模型层采用Java实现,主要决定用来做什么
●整个Web框架大致的流程是:
首先客户端发送请求,提交JSP页面给Servlet,Servlet根据客户的请求,选择相应的模型层,进行相应的逻辑处理;如果需要使用数据库,则通过DAO进行相应的数据库操作
(4)Struts1的组件结构图
(5)Struts2的架构/MVC
Struts2相关介绍
Struts2官网:
http:
//struts.apache.org/
Struts2使用:
Struts2是Struts的下一代产品,是在struts和WebWork的技术基础上进行了合并的全新的Struts2框架。
其全新的Struts2的体系结构与Struts1的体系结构的差别巨大。
Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts2可以理解为WebWork的更新产品。
虽然从Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2只有很小的变化。
Struts2的体系与Struts1体系的差别非常大,因为Struts2使用了WebWork的设计核心,而不是Struts1的设计核心。
Struts2中大量使用拦截器来处理用户的请求,从而允许用户的业务逻辑控制器与ServletAPI分离。
【14.2.2第一个Struts2程序】
1.搭建Struts2环境的步骤:
(1)找到开发Struts2应用需要的jar文件
(2)编写Struts2的配置文件
(3)修改web.xml,加入Struts2MVC框架启动配置
2.下载struts-2.3.28-all.zip,下载地址:
http:
//struts.apache.org/
下载后解压
3.开发Struts2最少需要的jar
【例1】
开发一个Struts2应用
1.在MyEclipse下新建一个webproject
2.将上述jar文件考到lib目录下
3.从例子中找一个struts.xml,考到src下
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
/WEB-INF/page/hello.jsp
4.修改web.xml
xmlversion="1.0"encoding="UTF-8"?
>
xmlns="
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
struts2
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
struts2
/*
index.jsp
注意:
(1)Struts框架是通过Filter启动的。
(2)
struts2
org.apache.struts2.dispatcher.FilterDispatcher
自struts-2.1.3之后已经过时
5.编写Action,观察Action的特点。
packagemy.example;
publicclassHelloWorldAction{
privateStringmessage;
publicStringgetMessage(){
returnmessage;
}
publicStringexecute(){
message="myfirstpage";
return"success";
}
}
6.在WEB-INF下新建page文件夹,然后新建hello.jsp文件
内容如下:
${message}
运行时在地址栏输入
http:
//localhost:
8080/工程名/test/helloworld
观察运行结果
Package介绍:
在struts2框架中使用包来管理Action,包的作用和java中的类包是非常类似的,它主要用于管理一组业务功能相关的action.在实际应用中,我们应该把一组业务功能相关的Action放在同一个包下。
配置包时必须指定name属性,该name属性值可以任意取名,但必须唯一,如果其他包要继承该包,必须通过该属性进行引用。
包的namespace属性用于定义该包的命名空间,命名空间作为访问该包下Action路径的一部分。
Namespace属性可以不配置,如果不指定该属性,默认的命名空间为“”
通常每个包都应该继承struts-default包,因为struts2很多核心的功能都是拦截器来实现。
当包继承了struts-default才能使用struts2提供的核心功能。
Struts-default包是在struts2-core-2.x.x.jar文件中的struts-default.xml中定义。
【例2】——请求参数的注入
1.web.xml不变
2.修改Action
packagemy.example;
publicclassUserAction{
privateStringusername;
privateStringpassword;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringexecute()throwsException{
//只有用户名为xxx,密码为123456方可成功登陆
if(username.equals("xxx")&&password.equals("123456")){
return"success";
}else{
return"error";
}
}
}
3.配置struts.xml
Struts2框架的核心配置文件就是struts.xml,该文件主要负责Struts2应用中各Action的具体实现逻辑。
struts.xml会根据不同请求找到具体的Action,然后根据Action返回的逻辑视图名找到具体的物理视图。
/jsp/success.jsp
/jsp/error.jsp
解释:
(1)该文件发布的时候必须放置在WEB-INF/classes路径下,当程序运行的时候会自动在该目录下搜索struts.xml。
(2)在action标签中定义了name和class。
name属性对应的是用户URL请求中的action名,比如在本应用中,用户请求为http:
//localhost:
8080/Struts2/loginUser.action,那么name属性就应该为loginUser。
class属性是处理请求的实现类(注意:
要包含完整路径),本应用的实现类是my.example.UserAction。
(3)result标签定义逻辑视图和物理视图之间的映射,在我们的Action中,如果返回的字符串是"success”则由对应的success.jsp页面进行处理;如果返回的字符串是"error”则由error.jsp页面进行处理。
4.编写视图
【编写login.jsp】
<%@pagelanguage="java"import="java.util.*"pageEncoding="GB2312"%>
<%@taglibprefix="s"uri="/struts-tags"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
">
MyJSP'login.jsp'startingpageformaction="loginUser">
textfieldname="username"label="用户名">
textfield>
passwordname="password"label="密码">
password>
submitvalue="确定"/>
resetvalue="重置"/>
form>
【编写success.jsp】
<%@pagelanguage="java"import="java.util.*"pageEncoding="Gb2312"%>
<%@taglibprefix="s"uri="/struts-tags"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
">
MyJSP'success.jsp'startingpage
登陆成功!
!
!
您的用户名是propertyvalue="username">
property>
说明:
property>访问action中的属性
【编写error.jsp】
<%@pagelanguage="java"import="java.util.*"pageEncoding="ISO-8859-1"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
">
MyJSP'error.jsp'startingpageerror!
!
!
在地址栏输入:
http:
//localhost:
8080/struts2_example2/jsp/login.jsp
验证结果。
注意:
Action类中get和set方法都要生成。
分析这个例子:
在地址栏里输入
http:
//localhost:
8080/ch2_example1/jsp/login.jsp
填写了用户名和密码之后,地址栏变为
http:
//localhost:
8080/ch2_example1/jsp/loginUser.action
过滤器对URL进行解析以便将请求进行正确的映射,
http是网络传输协议的名称,
localhost为主机名称,
8080为web应用端口,
ch2_example1为工程名,
jsp为目录名,
/loginUser.action为要映射模型组件的URL,除去扩展名action,则剩余的URL地址为/loginUser,
分别对应模型组件的package对应的命名空间“/”和模型组件的名称loginUser。
接下来过滤器StrutsPrepareAndExecuteFilter将在Struts2的配置文件struts.xml中查找命名空间为“/”的package,然后在此包中寻找名为loginUser的Action模型组件,最后将请求转到Action对应的实现类my.example.UserAction
现在接力棒传给模型组件UserAction,负责处理客户请求的是它的execute()方法。
execute()方法最终会返回一个代表处理结果的字符串,然后Struts2框架将根据字符串在配置文件struts.xml中此模型组件包含的result选项中寻找匹配的选项,并将此选项对应的视图组件返回到客户端。
【14.3.1认识Action对象】
在Struts2框架中,Action组件不需要继承任何类,实现任何接口,它可以只是一个简单的Java对象,只需要提供一个没有参数的且返回字符串信息的公共方法,作为默认的对请求信息进行处理并返回结果视图的接口。
框架还提供了一个Action组件的基类ActionSupport,它在实现了Action接口的同时实现了execute()方法。
ActionSupport的定义:
http:
//struts.apache.org/2.0.6/struts2-core/apidocs/com/opensymphony/xwork2/ActionSupport.html
该类的作用:
Providesadefaultimplementationforthemostcommonactions.Seethedocumentationforalltheinterfacesthisclassimplementsformoredetailedinformation.
publicclassActionSupport
extendsObject
implementsAction,Validateable,ValidationAware,TextProvider,LocaleProvider,Serializable
【修改例2】
1.login.jsp:
内容不变
页面展示形式为:
<%@pagelanguage="java"import="java.util.*"pageEncoding="GB2312"%>
<%@taglibprefix="s"uri="/struts-tags"%>
MyJSP'login.jsp'startingpageformaction="loginUser">
textfieldname="username"label="用户名">
textfield>
passwordname="password"label="密码">
password>
submitvalue="确定"/>
form>
2.修改UserAction:
packagemy.example;
importcom.opensymphony.xwork2.*;
publicclassUserActionextendsActionSupport{
privateStringusername;
privateStringpassword;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringexecute(){
if(!
username.equals(password))
returnINPUT;
elsereturnSUCCESS;
}
}
该execute()方法的作用:
如果用户名和密码一致,则返回一个表示登录成功的SUCCESS,否则返回结果字符串INPUT。
另外,Action组件还提供了两个字符串属性username和password以及对应的getter/setter方法,这两个属性提供给Struts2框架用来装载用户提交的参数。
Web请求中的参数信息将由框架自动填充到这两个属性变量中。
Execute()方法中也引用此信息进行业务处理。
3.结果界面success.jsp不变:
<%@pagelanguage="java"import="java.util.*"pageEncoding="Gb2312"%>
<%@taglibprefix="s"uri="/struts-tags"%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
MyJSP'success.jsp'startingpage登陆成功!
!
!
您的用户名是propertyvalue="username">
property>
4.配置文件struts.xml: