收藏 分销(赏)

很好的Struts2教程.doc

上传人:xrp****65 文档编号:7699994 上传时间:2025-01-12 格式:DOC 页数:46 大小:734KB 下载积分:10 金币
下载 相关 举报
很好的Struts2教程.doc_第1页
第1页 / 共46页
很好的Struts2教程.doc_第2页
第2页 / 共46页


点击查看更多>>
资源描述
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,其代码如下: package mypack; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport { private String username; private String userpass; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getUserpass() { return userpass; } public void setUserpass(String userpass) { this.userpass = userpass; } @Override public String execute() throws Exception { if ("Mike".equals(username) && "123".equals(userpass) || "张三".equals(username) && "abc".equals(userpass)) return "success"; else return "error"; } } 在src目录下建立Struts2的配置文件struts.xml,内容如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <!-- 定义包管理配置的action 继承struts-default.xml中的配置 --> <package name="actions" extends="struts-default"> <!-- 定义Action(login.action) --> <action name="login" class="mypack.UserAction"> <!-- 定义转发路径对应的字符串名 --> <result name="success">/Success.jsp</result> <result name="error">/Error.jsp</result> </action> </package> </struts> 修改web.xml,在其中加入一个过滤器,过滤/*路径。 <!-- 过滤器类 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <!-- 过滤所有的url请求 --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 在webroot目录下编写3个jsp页面,index.jsp、Success.jsp和Error.jsp,注意这里把page指令中的pageEncoding设置为“utf-8”,就没有中文问题了。 l index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body> <!-- 提交到action --> <form action="login.action" method="post"> 用户名: <!-- 参数名和action中的属性名一样 --> <input type=text name=username> <br> 密&nbsp;&nbsp;码: <input type=password name=userpass> <br> <input type=submit name=subm value="提交"> <input type=reset name=reset value="取消"> </form> </body> </html> l Success.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'Success.jsp' starting page</title> </head> <body> <h1> 欢迎 <%=request.getParameter("username")%> ,登录 </h1> </body> </html> l Error.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'Error.jsp' starting page</title> </head> <body> <h1> 用户名或密码错误! </h1> </body> </html> 把程序部署在tomcat5.5以上的版本中运行。 图1-2 index.jsp 图1-3 Success.jsp 八、 Struts2的中文乱码解决 中文乱码问题一般是指当请求参数有中文时,无法在Action中得到正确的中文。Struts2中有2种办法可以解决这个问题: l 设置JSP页面的pageEncoding=”utf-8”,就不会出现中文乱码; l 如果JSP页面的pageEncoding=”GBK”,那么需要修改struts.i18n.encoding=GBK,在struts.xml中加入如下语句进行修改。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.encoding" value="GBK"/> …… </struts> 上面2种方法可以解决POST请求中的中文参数,但是GET请求中的中文参数不能解决,GET请求中的中文参数的乱码需要通过修改Tomcat的server.xml文件来解决,修改如下内容,加入URIEncoding=”GBK”: <Connector port="8080" …… URIEncoding="GBK"/> 九、 Struts2的Action中访问web对象 Struts2的Action就是一个普通的POJO对象,它和Web对象request、response、session和application没有耦合在一起,这样便于单独测试Action,那么我们在Action中如何访问这些web对象呢? 访问这些web内部对象有2种方式: l 直接访问Web对象 Struts2框架提供org.apache.struts2.ServletActionContext辅助类来获得web对象。 HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession(); ServletContext application = ServletActionContext.getServletContext(); l Action访问ActionContext com.opensymphony.xwork2.ActionContext是一个Action执行的上下文,Action执行期间所用到的对象都保存在ActionContext中,例如session、参数等,并且ActionContext是一个局部线程变量,不用担心Action的线程安全。 ActionContext context = ActionContext.getContext(); 该类的常用方法见表1-3所示: 表1-3 ActionContext中的常用方法 Object get(Object key) 使用key来查找当前ActionContext中的值 Map getApplication() 返回一个Application范围的Map static ActionContext getContext() 获得当前线程的ActionContext实例 Map getParameters() Map类型的所有HttpServletRequest的参数 Map getSession() Map类型的HttpSession值 ValueStack getValueStack() 返回一个ValueStack类型OGNL值栈 void put(Object key,Object value) 向当前ActionContext存入值,等于在HttpServletRequest中加入值 void setApplication(Map application) 设置application上下文 void setSession(Map session) 设置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. 生成一个web project,名称为“Struts2按类别查询图书”,指定存放路径为f:\ Struts2按类别查询图书; 2. 生成Model层的JavaBean; l 数据库连接类DbConn.java package db; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DbConn { public static Connection getConn() { Connection conn = null; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); conn = DriverManager.getConnection( "jdbc:sqlserver://localhost:1433;databasename=pubs", "sa", ""); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } } l 数据库查询类BookOper.java package oper; import java.sql.Connection; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import po.Book; public class BookOper { public List<Book> selectByType(String type) { Connection conn = db.DbConn.getConn(); java.sql.PreparedStatement pstmt = null; java.sql.ResultSet rs = null; List<Book> data = new ArrayList<Book>(); try { pstmt = conn .prepareStatement("select title_id,title,type,price from titles where type=?"); pstmt.setString(1, type); rs = pstmt.executeQuery(); while (rs.next()) { Book book = new Book(); book.setTitleid(rs.getString(1)); book.setTitle(rs.getString(2)); book.setType(rs.getString(3)); book.setPrice(rs.getFloat(4)); data.add(book); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (rs != null) try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (pstmt != null) try { pstmt.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (conn != null) try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return data; } } l 数据持久化类Book.java package po; //图书的数据类 public class Book { private String titleid; private String title; private String type; private float price; public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getTitleid() { return titleid; } public void setTitleid(String titleid) { this.titleid = titleid; } public String getType() { return type; } public void setType(String type) { this.type = type; } } 3. 生成Struts2的Action对象,在src目录中编写action的配置文件struts.xml; l BookAction.java package action; import oper.BookOper; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class BookAction extends ActionSupport { private String type; //书类型 private BookOper bo = new BookOper(); //查询类 public String getType() { return type; } public void setType(String type) { this.type = type; } @Override public String execute() throws Exception { // TODO Auto-generated method stub //查询结果放在request中 ActionContext.getContext().put("booklist", bo.selectByType(type)); //返回success指定的页面 return SUCCESS; //"success" } } l struts.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="actions" extends="struts-default"> <action name="typequery" class="action.BookAction"> <!-- name="success" --> <result>/booklist.jsp</result> </action> </package> </struts> 4. 生成JSP页面index.jsp和booklist.jsp; l index.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> </head> <body> <h1>按类别查询图书</h1> <form action="typequery.action" method="post"> 书籍类别:<input type=text name=type> <!-- 参数名和action中属性名一样 --> <input type=submit name=subm value="查询"> </form> </body> </html> l booklist.jsp <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri=" prefix="c" %> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'booklist.jsp' starting page</title> </head> <body> <h1>查询结果</h1> <table border=1> <tr><th>编号</th><th>名称</th><th>类型</th><th>单价</th></tr> <c:forEach var="book" items="${booklist}"> <tr><td>${book.titleid }</td> <td>${book.title }</td> <td>${book.type }</td> <td>${book.price }</td></tr> </c:forEach> </table> </body> </html> 5. 修改web.xml,在其中配置Struts2的过滤器; <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns=" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.FilterDispatcher </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app> 6. 在tomcat5.5以上版本中部署web程序为“type”,运行效果如图1-8和1-9。 图1-8 index.jsp 图1-9 booklist.jsp 46 Struts2(下) 一、 Action的分类 1. 继承ActionSupport实现Action 通过继承ActionSupport来实现Action是我们的推荐做法,因为ActionSupport中提供了输入验证、国际化、execute等常用方法,使得编写Action时代码很简单。 package mypack; import com.opensymphony.xwork2.ActionSupport; public class HelloWorld extends ActionSupport { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String execute() throws Exception { // TODO Auto-generated method stub message = "大家好!"; return SUCCESS; } } ActionSupport实现了Action接口,这个接口中定义了一些常量和execute方法。 public abstract interface com.opensymphony.xwork2.Action{ // 定义常量 public static final java.lang.String SUCCESS = "success"; public static final java.lang.String NONE = "none"; public static final java.lang.String ERROR = "error"; public static final java.lang.String INPUT = "input"; public static final java.lang.String LOGIN = "login"; // 定义抽象方法 public abstract java.lang.String execute() throws Exception; } ActionSupport类的代码部分内容如下: public class com.opensymphony.xwork2.ActionSupport implements com.opensymphony.xwork2.Action,com.opensymphony.xwork2.Validateable, com.opensymphony.xwork2.ValidationAware,com.opensymphony.xwork2.TextProvider, com.opensymphony.xwork2.LocaleProvider,java.io.Serializable{ ...... //添加字段异常 public void addFieldError(java.lang.String fieldName,java.lang.String errorMessage){} //execute public String execute() throws Exception{} //输入验证 public void validate(){} ...... } struts.xml的配置如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="actions" extends="struts-default"> <action name="hello" class="mypack.HelloWorld"> <result>/Success.jsp</result> </action> </package> </struts> 2. 模型驱动(ModelDriven)的Action Struts2的Action属于MVC模型层,Action中的方法代表业务逻辑,Action中的属性代表请求中的参数,当页面请求参数较多的时候,把过多的参数对象的属性定义在Action中不太符合Struts所倡导的松耦合原则,所以我们推荐单独用JavaBean来封装参数,在A
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服