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) {
https://www.doczj.com/doc/6615357123.html,ername = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
https://www.doczj.com/doc/6615357123.html,erpass = 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,内容如下:
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://www.doczj.com/doc/6615357123.html,/dtds/struts-2.0.dtd">
修改web.xml,在其中加入一个过滤器,过滤/*路径。
在webroot目录下编写3个jsp页面,index.jsp、Success.jsp和Error.jsp,注意这里把page 指令中的pageEncoding设置为“utf-8”,就没有中文问题了。
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
●Success.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
欢迎
<%=request.getParameter("username")%>
,登录
●Error.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
用户名或密码错误!
把程序部署在tomcat5.5以上的版本中运行。
图1-2 index.jsp
图1-3 Success.jsp
八、Struts2的中文乱码解决
中文乱码问题一般是指当请求参数有中文时,无法在Action中得到正确的中文。Struts2中有2种办法可以解决这个问题:
●设置JSP页面的pageEncoding=”utf-8”,就不会出现中文乱码;
●如果JSP页面的pageEncoding=”GBK”,那么需要修改struts.i18n.encoding=GBK,在
struts.xml中加入如下语句进行修改。
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://www.doczj.com/doc/6615357123.html,/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对象。HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = request.getSession();
ServletContext application = ServletActionContext.getServletContext();
●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;
数据库连接类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;
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;
}
}
数据库查询类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
Connection conn = db.DbConn.getConn();
java.sql.PreparedStatement pstmt = null;
java.sql.ResultSet rs = null;
List
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;
}
}
数据持久化类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;
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"
}
}
●struts.xml
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://www.doczj.com/doc/6615357123.html,/dtds/struts-2.0.dtd">
4.生成JSP页面index.jsp和booklist.jsp;
●index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
●booklist.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="https://www.doczj.com/doc/6615357123.html,/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
编号 | 名称 | 类型 | 单价 |
---|---|---|---|
${book.titleid } | ${book.title } | ${book.type } | ${book.price } |
5.修改web.xml,在其中配置Struts2的过滤器;
xmlns:xsi="https://www.doczj.com/doc/6615357123.html,/2001/XMLSchema-instance" xsi:schemaLocation="https://www.doczj.com/doc/6615357123.html,/xml/ns/j2ee https://www.doczj.com/doc/6615357123.html,/xml/ns/j2ee/web-app_2_4.xsd"> org.apache.struts2.dispatcher.FilterDispatcher
6.在tomcat5.5以上版本中部署web程序为“type”,运行效果如图1-8和1-9。
图1-8 index.jsp
图1-9 booklist.jsp
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 https://www.doczj.com/doc/6615357123.html,ng.String SUCCESS = "success";
public static final https://www.doczj.com/doc/6615357123.html,ng.String NONE = "none";
public static final https://www.doczj.com/doc/6615357123.html,ng.String ERROR = "error";
public static final https://www.doczj.com/doc/6615357123.html,ng.String INPUT = "input";
public static final https://www.doczj.com/doc/6615357123.html,ng.String LOGIN = "login";
// 定义抽象方法
public abstract https://www.doczj.com/doc/6615357123.html,ng.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(https://www.doczj.com/doc/6615357123.html,ng.String fieldName,https://www.doczj.com/doc/6615357123.html,ng.String errorMessage){}
//execute
public String execute() throws Exception{}
//输入验证
public void validate(){}
......
}
struts.xml的配置如下:
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://www.doczj.com/doc/6615357123.html,/dtds/struts-2.0.dtd">
2.模型驱动(ModelDriven)的Action
Struts2的Action属于MVC模型层,Action中的方法代表业务逻辑,Action中的属性代表请求中的参数,当页面请求参数较多的时候,把过多的参数对象的属性定义在Action中不太符合Struts所倡导的松耦合原则,所以我们推荐单独用JavaBean来封装参数,在Action 中为JavaBean赋值,这就是ModelDriven的Action。模型驱动的Action要求Action实现ModelDriven接口,假如登录页面需要传输参数username和userpass,我们把这2个参数封装在一个数据的JavaBean中,然后在Action中定义该JavaBean为Model即可,代码如下: Userinfo.java
package po;
//用户名和密码的封装对象
public class Userinfo {
private String username;
private String userpass;
public String getUsername() {
return username;
}
public void setUsername(String username) {
https://www.doczj.com/doc/6615357123.html,ername = username;
}
public String getUserpass() {
return userpass;
}
public void setUserpass(String userpass) {
https://www.doczj.com/doc/6615357123.html,erpass = userpass;
}
}
●UserAction.java
package action;
import https://www.doczj.com/doc/6615357123.html,erinfo;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class UserAction extends ActionSupport implements ModelDriven
private Userinfo model = new Userinfo();
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
//返回模型对象的实例
public Userinfo getModel() {
// TODO Auto-generated method stub
return model;
}
}
当请求该Action的时候,请求中的参数会自动填充到模型Userinfo的属性中,当然需要参数名和属性名一样,到跳转的页面上利用Struts2标签
●struts.xml
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://www.doczj.com/doc/6615357123.html,/dtds/struts-2.0.dtd">
●new.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
username:
3.多方法的Action
Action中的方法代表业务逻辑,那么一个模块中的多个业务逻辑如何用Action来处理呢?我们有2种办法来处理这个问题:
1.一个Action对应一个业务逻辑,实现方便,但是Action数量多,struts.xml中需要配置
的内容也多,这种方法不推荐;
2.一个Action对应多个业务逻辑,例如表的CRUD操作,含有多个业务逻辑,我们只写
一个Action来实现,Action的数量没有增加,struts.xml的配置也简单,所以这种方法是我们推荐的做法。
Action中自定义方法的声明和execute方法一样,方法的调用路径为“Action名称!方法名称.action”。
public String 方法名() throws Exception{}
以用户表Userinfo的CRUD操作为例,看一下多方法Action的代码:
package action;
import https://www.doczj.com/doc/6615357123.html,erinfo;
import https://www.doczj.com/doc/6615357123.html,erService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class CrudUserAction extends ActionSupport implements ModelDriven
// crud业务方法
private UserService userservice = new UserService();
private Userinfo userinfo=new Userinfo();
// 模型对象userinfo
public Userinfo getModel() {
// TODO Auto-generated method stub
return userinfo;
}
// 增加
public String create() throws Exception {
userservice.createUser(userinfo);
return SUCCESS;
}
// 查询
public String retrive() throws Exception {
// 查询结果放在request中
ActionContext.getContext().put("userlist", userservice.selectUsers());
return "list";
}
// 修改
public String update() throws Exception {
userservice.updateUser(userinfo);
return SUCCESS;
}
// 删除
public String delete() throws Exception {
userservice.deleteUser(userinfo.getUsername());
return SUCCESS;
}
// 默认的execute
public String execute() throws Exception {
return SUCCESS;
}
}
在struts.xml中配置如下:
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"https://www.doczj.com/doc/6615357123.html,/dtds/struts-2.0.dtd">
调用CRUD业务逻辑的请求路径见表2-1。
表2-1 多方法Action中每个方法的请求路径
业务逻辑方法请求路径
create() CrudUser!create.action
retrive() CrudUser!retrive.action
update() CrudUser!update.action
delete() CrudUser!delete.action
execute() CrudUser.action
二、Result类型
Action中表示跳转的目的地使用了在struts.xml配置的字符串,格式为:
●dispatcher
转发到JSP页面,和
●redirect
重定向到JSP页面,和response.sendRedirect(“”)的效果一样。
●redirect-action
重定向到action,目的地为Action,配置时可以指定如下两个参数:actionName-重定向的Action名;namespace-重定向的Action所在的命名空间。
myaction
/test
●chain
转发到action,形成action-chain,可以指定两个参数:actionName-重定向的Action名;namespace-重定向的Action所在的命名空间。
myaction
/test
●stream
用于向页面返回一个InputStream,原始数据直接传递给HttpServletResponse,这种结果类型在用户下载文件(例如PDF文件等)等情况下非常有意义。
image/jpg
imageStream
filename=”document.pdf”
1024
2012年第11卷第6期 产业与科技论坛2012.(11).6 Industrial &Science Tribune Struts2框架工作原理及应用体会 □宋 君 张家爱 【摘要】通过针对特定用户的分析,搭建以Struts2为技术核心的旅行社管理系统。本文简单的介绍了MVC 、 Struts2的工作原理,同时总结了在项目制作过程中所得到的心得。 【关键词】 Struts2;MVC ;FilterDispatcher ;Action 【基金项目】本文为大学生科技创新院级基金项目(编号:2011070)成果 【作者单位】宋君,吉林农业科技学院信息工程学院;张家爱,吉林农业科技学院信息工程学院教师 本着锻炼自我与积极参与到实用性技术的目标,以发掘自身创新意识为前提。利用空闲时间,在老师的指导下,进行了一次大学生创新项目的实践性活动。本着实用原则,以某中小旅行社为客户(根据用户需求,匿名),以Struts2框架为基点,进行了一次旅行社管理系统的开发。在项目结束之余, 特将在项目过程中经历的种种认识进行了简单的总结,希望让阅读本文的朋友们,更多的参与到此类活动中。 一、基础思想— ——MVC 简述作为时下经典框架之一, MVC 具有其独特的价值。MVC 框架简单的说,就是将数据模型与用户视图进行分离。通过控制器进行协调处理的一种结构是框架。同时,也是本文中要讨论的Sturts2框架的基础思想。 M 是指模型层(Model ),V 是指用户视图(View ),C 则是指控制器 (Controller )。这种划分方式是以将模型层与视图层进行代码分离,从而降低两者之间的耦合性,使同一程序可以使用不同形式进行表现。不同层之间的修改不会或尽量少的印象到其他层功能的史前为前提。有效的提高的代码的维护性和设计难度。 图1 二、 Struts2工作原理(一)Struts2框架组成。Struts2框架由三个主要部分组成:核心控制器、业务控制器,以及由用户实现的业务逻辑组件。这里我们将侧重于核心控制器与业务控制器的理解与说明。 (二)核心控制器:FilterDispatcher 。FilterDispatcher 是Struts2框架的核心控制器,在此,我们可以将FilterDispatcher 看作一个类似于过滤网的过滤器。当用户发出请求,并到达Web 硬哟那种时,该过滤器会过滤用户请求。如果用户请求的结尾为action ,则将该请求转入Struts2框架进行处理。当Struts2框架获得了*.actio 请求后,会根据请求前面“*”的那部分内容,决定调用哪个业务逻辑组件作为响应单位。这里需要说明的是Struts2用来处理用户请求的Action 实例并不是业务控制器,而是作为Action 的代理———正因为Struts2的一大特点,与Servlet API 的非耦合性,使得用户实现的业务控制器无法直接处理用户请求。有效的提高了后期调试维护的效率。而Struts2框架再次提供了了一系列的拦截器。这些拦截器负责将HttpServletRequest 请求的参数解析出来,传入Action 中,并毁掉Action 的Execute 方法来处理用户请求。用户实现的Action 类仅作为Struts2的Action 代理的代理目标。用户实现的业务控制器则包含了对用户请求的处理。用户的请求数据包含在HttpServletRequest 对象中,而用户的Action 类无需访问HttpServletRequest 对象。拦截器负责将HttpServletRequest 里的请求数据解析出来,并传给业务逻辑组件Action 实例。 (三)业务控制器。业务控制器就是前文提到的用来实现用户Action 的实力,这里的每个Action 类通常包含有一个execute 方法,当业务控制器处理完用户的请求后,该方法将会针对此次处理返回一个字符串— ——该字符串就是一个逻辑树图名。当程序开发人员开发出系统所需要的业务控制器后,还需要针对性的配置Struts2的Action ,即需要配置Ac- tion 的以下三个部分:(1)Action 所处理的URl 。(2)Action 组件所对应的实现类。(3)Action 里包含的逻辑试图和物理资源之间的对应关系。每个Action 都要处理一个用户请求,而用户请求则总是包含有指定的URL 。当核心控制器过滤用户请求,并调用后,根据请求的URL 和Action 处理URL 之间的对应关系来处理转发。 · 342·
阐述struts2的执行流程。 Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher、业务控制器Action 和用户实现的企业业务逻辑组件。 核心控制器FilterDispatcher是Struts 2框架的基础,包含了框架内部的控制流程和处理 机制。业务控制器Action和业务逻辑组件是需要用户来自己实现的。用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件,供核心控制器FilterDispatcher来使用。Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,所以说Struts 2 是WebWork的升级版本。 基本简要流程如下: 1、客户端浏览器发出HTTP请求。 2、根据web.xml配置,该请求被FilterDispatcher接收。 3、根据struts.xml配置,找到需要调用的Action类和方法,并通过IoC方式,将值注入给Aciton。 4、Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。 5、Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到 相应页面。 6、返回HTTP响应到客户端浏览器。 工作原理 在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否 需要调用某个Action 4 如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 5 ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action 类 6 ActionProxy创建一个ActionInvocation的实例。 7 ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。 8 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP
Struts 2作业 1.简述什么是MVC? 答:MVC 的全称为model-view-controller(模型-视图-控制器)。MVC 是一种开发应用程序的模式,这个模式已经具有了很好的框架架构,并且十分容易维护。使用MVC 开发出来的应用程序一般包括以下几块内容:·控制器(Controller):控制器类处理客户端向Web 应用程序发出的请求,获取数据,并指定返回给客户端,用来显示处理结果的视图。·模型(Model):模型类代表了应用程序的数据,这些数据通常具有一个数据验证逻辑,用来使得这些数据必须符合业务逻辑。·视图(View):视图类是Web 应用程序中用来生成并显示HTML 格式的服务器端对客户端请求的响应结果的模板文件 2.Struts 2以(WebWork)为核心,采用(拦截器)的机制来处理用户的 请求。 3.简述一个请求在Struts 2框架中的处理流程,请按自己对框架的理解叙述。答:1-用户提交自己的请求;2-由web.xml拦截,转发到action进行处理;3- Struts.xml根据相应的action配置,调用相应的方法来处理,并根据结果转发到不同的页面。 4.不属于Action接口中定义的字符串常量是( B )? A)SUCCESS B)FAILURE C)ERROR D)INPUT 5.资源文件的后缀名为(D)? A)txt B)doc C)property D)properties 6.在JSP页面中可以通过Struts 2提供的(D)标签来输出国际化信息。 A)
一、 1、struts2 struts2是mvc设计思想的一个实现,可以将项目低耦合,提高扩展性 2、struts2和struts1的区别 struts2不是struts1的升级,而是继承的下xwork的血统,它吸收了struts1和webwork 的优势。 struts2的action是原型,安全的,struts2的action是单例,非安全 3、步骤: 1、导入包 2、在web.xml文件中,加入struts2的核心拦截器 3、在src下放入struts2的xml struts.xml 4、url http://localhost:8080/Struts2_01_HelloWorld/demo/hello.action 二、 1、默认值 2、转发和重定向的区别 转发:url显示的依然是上一个的url,共享上一次的请求 重定向:url显示的是下一个的url,不共享 3、url http://localhost:8080/Struts2_02_Default/demo/hello.action 4、路径 http://localhost:8080/Struts2_02_Default/demo/a/b/c/hello.action 1、原路径找不到,http://localhost:8080/Struts2_02_Default/demo/a/b/hello.action 2、如果1找不到,http://localhost:8080/Struts2_02_Default/demo/a/hello.action 3、如果2找不到,http://localhost:8080/Struts2_02_Default/demo/hello.action 3、如果3找不到,http://localhost:8080/Struts2_02_Default/hello.action 三、 11、自定义action
1.系统分析与设计 1.1 系统功能描述 本系统是个非常简单的注册、登录系统。本系统的实现是基于Struts2、Spring、Hibernate 三个框架,系统功能单一,业务逻辑简单。 当用户注册信用户时,就是向系统中增加一个新用户,对应的数据库增加一条记录。 当用户输入注册信息时,系统提供了基本的输入验证判断用户输入是否合法,只有当用户输入满足基本输入要求时,才会被提交到实际的登录系统,进行实际的登录处理。 系统还使用了随机产生的图形验证码来防止刷新,防止用户通过单击浏览器的书安心按钮来重复注册多个用户。 系统还提供了一种Ajax方式来验证用户输入的注册名是否有效,系统要求所有的用户名不能重复。故当用户输完用户名后,系统立即在页面上方提示用户该用户名是否可用,如果系统中没有该用户名,则系统提示该用户名可用;否则提示用户该用户名重复,用户必须重新选择用户名注册。 当用户注册一个新用户名之后,就可以使用系统的登录功能来登录系统了,用户输入登录用的用户名、密码后,系统一样提供了基本的输入校验。 除此之外,系统还采用了随机产生图形验证码来防止恶意用户的暴力破解,系统随机生成一个图形验证码,而用户登录必须输入图形验证码中显示的字符串,只有用户输入的字符串和系统随机生成的验证码字符相同时,系统才允许用户登录。 1.2 系统功能流程
1.3 数据库设计 相关的映射文件:
Struts2中数据标签使用示例 S truts2提供了大量丰富的标签供使用,它不再像S truts1中一样,将种类标签进行分门列别,但可以根据其使用的用途用以区别。本文通过对S truts2中数据标签的学习,来对S truts2中标签的学习起到一个抛砖引玉的作用。 文中将介绍Action标签、Bean标签、Data标签、Include标签、P aram标签、Set标签、T ext标签、P roperty 标签等标签。 代码下载:https://www.doczj.com/doc/6615357123.html,/y1ps2Mjpc3NiLKuetMOpCsZOOypD6KSdo8-46Zy2wpoMcABeo4vOC NJXtWDEO93-TXgZogwAF YxSOni5BEG2EoN65OFwHdG71v-/St ruts2DataTags.rar?download 一、