Struts2实例教程.docx
- 文档编号:13874823
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:69
- 大小:181.38KB
Struts2实例教程.docx
《Struts2实例教程.docx》由会员分享,可在线阅读,更多相关《Struts2实例教程.docx(69页珍藏版)》请在冰点文库上搜索。
Struts2实例教程
Struts2实例教程(上)
一、经典的MVC模式
二、Struts1.x对MVC的实现
三、Struts1.x的主要组件和作用
组件
作用
ActionServlet
中央控制器
Action
分控制器,调用JavaBean实现业务逻辑,Action可以分为Action、DispatchAction等不同类型
ActionForm
封装参数,实现服务器验证,文件上传等
Forward
转发到目的地,可以是JSP,也可以是另一个Action
Struts-config.xml
配置文件,配置有ActionForm,Action,Forward等,通过XML解析,然后使用反射技术使用该文件
Struts标签库
和JSTL类似,和Struts-config.xml、ActionForm、Action等对象可以紧密集成
四、Struts1.x开发实例-登录程序
见案例。
五、Struts2(WebWork)的MVC
Struts2的MVC架构
六、Struts2的主要组件
组件
作用
FilterDispatcher
起中央控制器作用的过滤器
Action
处于Model层的Action,调用JavaBean实现业务逻辑
struts.xml
核心配置文件,配置有Action、Result等
result
和forward类似,转发的目的地,支持多种视图技术。
七、Struts2的实例-登录
在MyEclipse环境中建立一个新的web工程,名称“Struts2Login”,存放路径“f:
\Struts2Login”。
在Struts2.0.11版本中找到war包struts2-blank-2.0.11.war,解开该war包,在WEB-INF/lib目录下复制出所有的jar包,这些jar包就是一个Struts2程序所需要的基础jar包,把它们复制到新建的web工程的WEB-INF/lib目录中。
在src目录下建立一个类,包名mypack,类名UserAction,其代码如下:
packagemypack;
importcom.opensymphony.xwork2.ActionSupport;
publicclassUserActionextendsActionSupport{
privateStringusername;
privateStringuserpass;
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetUserpass(){
returnuserpass;
}
publicvoidsetUserpass(Stringuserpass){
this.userpass=userpass;
}
@Override
publicStringexecute()throwsException{
if("Mike".equals(username)&&"123".equals(userpass)
||"张三".equals(username)&&"abc".equals(userpass))
return"success";
else
return"error";
}
}
在src目录下建立Struts2的配置文件struts.xml,内容如下:
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
--定义包管理配置的action继承struts-default.xml中的配置-->
--定义Action(login.action)-->
--定义转发路径对应的字符串名-->
修改web.xml,在其中加入一个过滤器,过滤/*路径。
--过滤器类-->
--过滤所有的url请求-->
在webroot目录下编写3个jsp页面,index.jsp、Success.jsp和Error.jsp,注意这里把page指令中的pageEncoding设置为“utf-8”,就没有中文问题了。
●index.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"
+request.getServerName()+":
"+request.getServerPort()
+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
--提交到action-->
用户名:
--参数名和action中的属性名一样-->
密 码:
●Success.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"
+request.getServerName()+":
"+request.getServerPort()
+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
欢迎
<%=request.getParameter("username")%>
登录
●Error.jsp
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"
+request.getServerName()+":
"+request.getServerPort()
+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
用户名或密码错误!
把程序部署在tomcat5.5以上的版本中运行。
图1-2index.jsp
图1-3Success.jsp
八、Struts2的中文乱码解决
中文乱码问题一般是指当请求参数有中文时,无法在Action中得到正确的中文。
Struts2中有2种办法可以解决这个问题:
●设置JSP页面的pageEncoding=”utf-8”,就不会出现中文乱码;
●如果JSP页面的pageEncoding=”GBK”,那么需要修改struts.i18n.encoding=GBK,在struts.xml中加入如下语句进行修改。
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEstrutsPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
"http:
//struts.apache.org/dtds/struts-2.0.dtd">
……
上面2种方法可以解决POST请求中的中文参数,但是GET请求中的中文参数不能解决,GET请求中的中文参数的乱码需要通过修改Tomcat的server.xml文件来解决,修改如下内容,加入URIEncoding=”GBK”:
九、Struts2的Action中访问web对象
Struts2的Action就是一个普通的POJO对象,它和Web对象request、response、session和application没有耦合在一起,这样便于单独测试Action,那么我们在Action中如何访问这些web对象呢?
访问这些web内部对象有2种方式:
●直接访问Web对象
Struts2框架提供org.apache.struts2.ServletActionContext辅助类来获得web对象。
HttpServletRequestrequest=ServletActionContext.getRequest();
HttpServletResponseresponse=ServletActionContext.getResponse();
HttpSessionsession=request.getSession();
ServletContextapplication=ServletActionContext.getServletContext();
●Action访问ActionContext
com.opensymphony.xwork2.ActionContext是一个Action执行的上下文,Action执行期间所用到的对象都保存在ActionContext中,例如session、参数等,并且ActionContext是一个局部线程变量,不用担心Action的线程安全。
ActionContextcontext=ActionContext.getContext();
该类的常用方法见表1-3所示:
表1-3ActionContext中的常用方法
Objectget(Objectkey)
使用key来查找当前ActionContext中的值
MapgetApplication()
返回一个Application范围的Map
staticActionContextgetContext()
获得当前线程的ActionContext实例
MapgetParameters()
Map类型的所有HttpServletRequest的参数
MapgetSession()
Map类型的HttpSession值
ValueStackgetValueStack()
返回一个ValueStack类型OGNL值栈
voidput(Objectkey,Objectvalue)
向当前ActionContext存入值,等于在HttpServletRequest中加入值
voidsetApplication(Mapapplication)
设置application上下文
voidsetSession(Mapsession)
设置session值,参数为Map实例
这种方法使用的所有对象和Web对象没有直接联系,所以在测试的时候也是很方便的,我们推荐在程序中使用此方法来访问web对象。
一十、操作实例Struts2实现按类别查询图书
本案例的工程文件结构如图1-7所示,文件说明见表1-4所示:
图1-7案例的工程文件结构
表1-4案例的文件说明
文件名
说明
BookAction.java
Strut2的Action
DbConn.java
数据库连接类
BookOper.java
数据库查询类
Book.java
数据对象类
struts.xml
Struts2的action配置文件
web.xml
Web应用配置文件,Struts2框架在其中配置了Filter
booklist.jsp
显示查询结果页面
Index.jsp
输入书籍类别的页面
1.生成一个webproject,名称为“Struts2按类别查询图书”,指定存放路径为f:
\Struts2按类别查询图书;
2.生成Model层的JavaBean;
●数据库连接类DbConn.java
packagedb;
importjava.sql.Connection;
importjava.sql.DriverManager;
importjava.sql.SQLException;
publicclassDbConn{
publicstaticConnectiongetConn(){
Connectionconn=null;
try{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conn=DriverManager.getConnection(
"jdbc:
sqlserver:
//localhost:
1433;databasename=pubs","sa",
"");
}catch(ClassNotFoundExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnconn;
}
}
●数据库查询类BookOper.java
packageoper;
importjava.sql.Connection;
importjava.sql.SQLException;
importjava.util.ArrayList;
importjava.util.List;
importpo.Book;
publicclassBookOper{
publicList
Connectionconn=db.DbConn.getConn();
java.sql.PreparedStatementpstmt=null;
java.sql.ResultSetrs=null;
List
try{
pstmt=conn
.prepareStatement("selecttitle_id,title,type,pricefromtitleswheretype=?
");
pstmt.setString(1,type);
rs=pstmt.executeQuery();
while(rs.next()){
Bookbook=newBook();
book.setTitleid(rs.getString
(1));
book.setTitle(rs.getString
(2));
book.setType(rs.getString(3));
book.setPrice(rs.getFloat(4));
data.add(book);
}
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}finally{
if(rs!
=null)
try{
rs.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
if(pstmt!
=null)
try{
pstmt.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
if(conn!
=null)
try{
conn.close();
}catch(SQLExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
returndata;
}
}
●数据持久化类Book.java
packagepo;
//图书的数据类
publicclassBook{
privateStringtitleid;
privateStringtitle;
privateStringtype;
privatefloatprice;
publicfloatgetPrice(){
returnprice;
}
publicvoidsetPrice(floatprice){
this.price=price;
}
publicStringgetTitle(){
returntitle;
}
publicvoidsetTitle(Stringtitle){
this.title=title;
}
publicStringgetTitleid(){
returntitleid;
}
publicvoidsetTitleid(Stringtitleid){
this.titleid=titleid;
}
publicStringgetType(){
returntype;
}
publicvoidsetType(Stringtype){
this.type=type;
}
}
3.生成Struts2的Action对象,在src目录中编写action的配置文件struts.xml;
●BookAction.java
packageaction;
importoper.BookOper;
importcom.opensymphony.xwork2.ActionContext;
importcom.opensymphony.xwork2.ActionSupport;
publicclassBookActionextendsActionSupport{
privateStringtype;//书类型
privateBookOperbo=newBookOper();//查询类
publicStringgetType(){
returntype;
}
publicvoidsetType(Stringtype){
this.type=type;
}
@Override
publicString
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Struts2 实例教程