初识 Struts2 第一节
前言 :
(1). 为什么学习 Struts2
简化开发 , 提高开发效率 .
(2) 如何学习 Struts2
首先学习如何去使用 , 有余力深入了解原理和实现
1. MVC 设计思想在 JavaWeb 程序中的应用
(1) 什么是 MVC, 为什么用 MVC
MVC 就是按照职责不同将程序划分为 3 个组成部分 . 可以改善程序结构 , 便于日后维护和扩展 .
模型 (Model): 负责业务处理和业务数据 .( 例如 DAO,DBUtil)
视图 (View): 负责数据的显示和与用户交互 ( 接受用户输入 ).( 例如 JSP)
控制器 (Controller): 负责协调视图和模型工作 .
(2)MVC 设计思想的基本流程
a. 所有请求都请求同一个控制器组件 .
b. 控制器负责维护一个 XML 配置文件 ( 配置文件主要定义请求和 Action 组件的对应关系 ).
c. 当请求进入到控制器 , 控制器根据 XML 配置 , 调用相应的 Action 组件进行业务处理 .
d.Action 组件可以调用 DAO 等模型进行数据库操作 .
f. 当 Action 执行完毕 , 控制器负责调用相应视图进行响应 .
(3)Struts 框架就是上述 MVC 思想的实现 .
2.Struts2 的入门实例
Struts 发展史
Struts1 1.1,1.2,1.3,Struts1.2 版本属于使用最广泛 , 最成熟的一个 .
WebWork 框架也是 MVC 实现 , 实现技术和思想非常先进 . 后来将 Xwork 内核提取 , 结合 Struts1 特性 , 包装成了 Struts2 推出 .
Struts2 版本 2.0,2.1.8,2.2
(1). HelloWorld
1) 开发步骤
请求 --> Struts2 --> welcome.jsp
a. 创建 Web 工程 , 引入 Struts2 的必要开发包 .
struts2-core-2.1.8.jar Struts2 核心
xwork-core-2.1.6.jar WebWork 核心
commons-fileupload-1.2.1.jar 文件上传与下载
ognl-2.7.3.jar 表达式语言 , 比 el 强大的表达式
freemarker-2.3.15.jar 视图模版技术 . 功能等价于 jsp, 技术比 jsp 先进 , 但现在企业应用一般都采用 jsp 充当视图 .
b. 配置 Struts2 的控制器 (web.xml)
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>Struts2Controller</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Struts2Controller</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
c. 添加一个视图 , welcome.jsp
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
welcome
</body>
</html>
d. 添加一个 Action 组件 (WelcomeAction)
package struts;
public class WelcomeAction {
public String execute(){
return "success";
}
}
e. 添加 WelcomeAction 组件配置 (src/struts.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="demo" extends="struts-default">
<action name="welcome" method="execute" class="struts.WelcomeAction" >
<result name="success">/welcome.jsp</result>
</action>
</package>
</struts>
struts.xml 的声明可以参照 struts2-core-2.1.8.jar 中的 struts-default.xml 文件定义
f. 测试 :http://localhost:8080/struts2/welcome.action
2) 示例运行流程
a. 客户端发出一个请求 , welcome.action
b. 请求进入 Struts2 控制器 (StrutsPrepareAndExecuteFilter), 控制器根据 struts.xml 配置文件调用 WelcomeAction 进行处理 .
c. 调用 WelcomeAction 的 execute 方法处理 , 处理完毕后返回一个 result 标识符 (String 类型 )
d. 控制器根据返回的 result 标识符调用 struts.xml 中定义的 <result> 元素 , 进行视图响应
4)struts.xml 基本配置 .
a. <struts> 根元素
b. <package> 元素 , 可以有多个 , 用于将 Action 分类管理 , 例如每个模块一个 package.
name : 包名称 .
extends : 继承父包 , 一般使用 struts-default. 此包在 struts-default.xml 配置中定义 , 包含了框架运行的一些必要组件 .
namespace : 命名空间 . 用于对 Action 请求名进行限定 . 用于避免请求名重名冲突 .
c. <action> 元素 , 用于指定 action 组件和请求之间的对应关系 .
name: 请求名 , 一般默认扩展名为 .action 或不写扩展名 .
class: 指定 action 组件 , 写明包路径 .
method: 指定调用 action 组件的那个方法 , 默认方法名为 execute.
d. <result> 元素 , 用于指定相应视图 .
name: 视图标识符 , 与 action 业务方法返回值一致 .
type: 指定视图类型 .
(2). 列表显示
1) 开发过程
a. 引入 struts 开发框架 , 配置 struts 控制器 .
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<filter>
<filter-name>ShowList</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ShowList</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
b. 添加一个视图 list.jsp.
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr>
<th>编号</th>
<th>任务名称</th>
<th>开始事件</th>
<th>结束事件</th>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</table>
</body>
</html>
c. 依次添加 entity, TaskDAO, TaskListAction.
package entity;
import java.util.Date;
public class Task {
private long id;
private String tas_id;
private String tas_name;
private Date tas_begin;
private Date tas_end;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTas_id() {
return tas_id;
}
public void setTas_id(String tasId) {
tas_id = tasId;
}
public String getTas_name() {
return tas_name;
}
public void setTas_name(String tasName) {
tas_name = tasName;
}
public Date getTas_begin() {
return tas_begin;
}
public void setTas_begin(Date tasBegin) {
tas_begin = tasBegin;
}
public Date getTas_end() {
return tas_end;
}
public void setTas_end(Date tasEnd) {
tas_end = tasEnd;
}
}
package dao;
import java.util.List;
import entity.Task;
public interface TaskDAO{
public List<Task> findAll() throws Exception;package action;
package dao.impl;
import java.util.ArrayList;
import java.util.List;
import java.sql.*;
import util.DBUtil;
import dao.TaskDAO;
import entity.Task;
public class TaskDAOimpl implements TaskDAO{
public List<Task> findAll() throws Exception {
List<Task> taskList = new ArrayList<Task>();
Connection conn = DBUtil.getConnection();
String sql = "select * from t_task";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
while(rs.next()){
Task task = new Task();
task.setId(rs.getLong("id"));
task.setTas_id(rs.getString("tas_id"));
task.setTas_name(rs.getString("tas_name"));
task.setTas_begin(rs.getDate("tas_begin"));
task.setTas_end(rs.getDate("tas_end"));
taskList.add(task);
}
DBUtil.close(conn);
return taskList;
}
}
import java.util.List;
import dao.impl.TaskDAOimpl;
import entity.Task;
public class TaskAction {
private List<Task> taskList;
public String execute(){
TaskDAOimpl dao = new TaskDAOimpl();
try {
taskList = dao.findAll();
return "success";
} catch (Exception e) {
e.printStackTrace();
return "error";
}
}
public List<Task> getTaskList() {
return taskList;
}
public void setTaskList(List<Task> taskList) {
this.taskList = taskList;
}
}
}
d. 在 struts.xml 中配置 TaskAction.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<package name="task" extends="struts-default">
<action name="list" class="action.TaskAction">
<result name="success">/WEB-INF/jsp/list.jsp</result>
<result name="error">/WEB-INF/jsp/error.jsp</result>
</action>
</package>
</struts>
e. 修改 list.jsp, 使用标签或 EL 将数据列表显示 .
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<table border="1">
<tr>
<th>编号</th>
<th>任务名称</th>
<th>开始事件</th>
<th>结束事件</th>
</tr>
<c:forEach items="${taskList}" var="list">
<tr>
<td>${list.tas_id}</td>
<td>${list.tas_name }</td>
<td>${list.tas_begin }</td>
<td>${list.tas_end }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
处理错误页面
<%@ page contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
系统错误, 稍后<a href="list">重试</a>
</body>
</html>
数据库脚本
create table t_task(
id bigint primary key auto_increment,
tas_id varchar(20),
tas_name varchar(50),
tas_begin date,
tas_end date
);
insert into t_task(tas_id, tas_name, tas_begin, tas_end) values ('任务1', '项目', '2011-1-1', '2011-1-3');
insert into t_task(tas_id, tas_name, tas_begin, tas_end) values ('任务1', '项目', '2011-1-3', '2011-1-5');
insert into t_task(tas_id, tas_name, tas_begin, tas_end) values ('任务1', '项目', '2011-1-5', '2011-1-7');
insert into t_task(tas_id, tas_name, tas_begin, tas_end) values ('任务1', '项目', '2011-1-7', '2011-1-9');
insert into t_task(tas_id, tas_name, tas_begin, tas_end) values ('任务1', '项目', '2011-1-9', '2011-1-12');
insert into t_task(tas_id, tas_name, tas_begin, tas_end) values ('任务1', '项目', '2011-1-12', '2011-1-16');
上一篇: struts2入门(三)——使用拦截器简单的登录验证
下一篇: struts2 session拦截器