欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

初识 Struts2 第一节

程序员文章站 2022-05-28 16:53:35
...

前言 :

         (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');