Struts2框架基本学习(一)--基本入门

一、Struts的概述

  1. 什么是Struts

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
–百度百科

  • Struts2是一个基于MVC设计模式的WEB层框架
  • Struts2的内核相对于Struts1来讲以及发生了巨大变化
  1. 常见的web层框架
  • Struts2
  • Struts1
  • Webwork
  • SpringMVC
  1. Web层的框架基于前端控制器模型
    在这里插入图片描述

二、Struts2入门

1、下载Struts2的开发环境

2、解压Struts2开发包

在这里插入图片描述

  • apps:Struts2提供的应用,war文件:web项目打包成war包。
  • docs:Struts2开发的文档和API
  • lib:Struts2框架开发的jar包
  • src:Struts2的源码

3、创建web项目,引入相应的jar包

  • 引入jar包:Struts-blank项目下找jar包
    在这里插入图片描述

4、创建一个JSP页面

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>Struts2的入门</h1>
<h3><a href="${ pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3>
</body>
</html>

5、编写Action的类

public class HelloAction {

	/**
	 * 提供一个方法:
	 * 	*方法签名是固定的:公有的返回值是String类型、方法名是execute
	 *  在这个方法中不能传递参数
	 */
	public String execute() {
		System.out.println("HelloAction执行了.....");
		return null;
	}
}

6、对Action进行配置

  • 在src下创建(提供)名称叫做struts.xml的配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
	"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
	<!-- Struts2为了管理Action的配置,通过包进行管理 -->
	<!-- 配置Struts2的包====== -->
	<package name="demo1" extends="struts-default" namespace="/">
		<!-- 配置Action==== -->
		<action name="hello" class="cn.itcast.struts.demo1.HelloAction"></action>
	</package>
</struts>

7、配置前端控制器(核心过滤器)

  • 在WebContent–>WEB-INF–>web.xml文件中配置
 <!-- 配置Struts2的核心过滤器 -->
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  
  <filter-mapping>
  	<filter-name>struts2</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

8、改写Action中的方法的返回值

	/**
	 * 提供一个方法:
	 * 	*方法签名是固定的:公有的返回值是String类型、方法名是execute
	 *  在这个方法中不能传递参数
	 */
	public String execute() {
		System.out.println("HelloAction执行了.....");
		return "success";
	}

9、改写struts.xml

<struts>
	<!-- Struts2为了管理Action的配置,通过包进行管理 -->
	<!-- 配置Struts2的包====== -->
	<package name="demo1" extends="struts-default" namespace="/">
		<!-- 配置Action==== -->
		<action name="hello" class="cn.itcast.struts.demo1.HelloAction">
			<!-- 配置页面的跳转 -->
			<result name="success">/demo1/success.jsp</result>
		</action>
	</package>
</struts>

10、编写success.jsp

<body>
<h1>跳转成功页面!</h1>
</body>

三、Struts2的在执行流程

在这里插入图片描述
当用户访问某一个Action的时候,先经过核心过滤器,在核心过滤器中执行一组拦截器(这组拦截器实现部分功能),执行目标Action,根据Action的返回值,进行页面跳转。

四、Struts2的常见配置

1、XML的提示问题

  • 配置XML的提示
    在这里插入图片描述

2、Struts2的配置文件的加载顺序(了解)

  1. Struts2的配置文件的加载顺序
			init_DefaultProperties(); // [1]
            init_TraditionalXmlConfigurations(); // [2]
            init_LegacyStrutsProperties(); // [3]
            init_CustomConfigurationProviders(); // [5]
            init_FilterInitParameters() ; // [6]
            init_AliasStandardObjects() ; // [7]
  • init_DefaultProperties(); ----加载default.properties
  • init_TraditionalXmlConfigurations(); ----加载struts-default.xml、struts-plugin.xml、struts.xml
  • init_LegacyStrutsProperties(); ----加载struts.properties
  • init_CustomConfigurationProviders(); ----加载配置提供类
  • init_FilterInitParameters() ; —加载web.xml中过滤器初始化参数
  • init_AliasStandardObjects() ; ----加载Bean对象
  1. 加载顺序
  • default.properties
  • struts-default.xml
  • struts-plugin.xml
  • struts.xml
  • struts.properties
  • web.xml

注意:后配置的**常量**的值会覆盖先配置的常量的值

3、Action的配置

(1) package的相关配置

package标签称为包,这个包与Java中的包的概念不一致。包为了更好管理action的配置。
package标签的属性

  • name:包的名称,只有在一个项目中不重名即可。
  • extends:继承哪个包,通常值为struts-default。
  • namespace:名称空间,与<action>标签中的name属性共同决定访问路径。
    • 名称空间有三种写法:
      • 带名称的名称空间 :namespace=”/aaa”
      • 跟名称空间 :namespance=”/”
      • 默认名称空间 :namespace=””
  • abstract :抽象的,用于其他包的继承。

(2) action的相关配置

  • action标签配置Action类。
  • action标签的属性
    • name:与namespace共同决定访问路径
    • class:Action类的全路径
    • method:执行Action中的哪个方法的方法名,默认值execute
    • converter:用于设置类型转换器

4、Struts2的常量的配置

在Struts2的框架中,提供了非常多的常量:(在default.properties

  • struts.i18n.encoding=UTF-8 ----Struts2中所有的post请求的中文乱码不用处理。
  • struts.action.extension=action, ----Struts2请求的默认的扩展名。默认扩展名是.action或者什么都不写。

在Struts2中修改一些常量的值:

  • 修改常量的值,可以有三个位置进行修正
  1. struts.xml中进行修改(习惯上使用)
<!-- 配置Struts2的常量 -->
	<constant name="struts.action.extension" value="action"/>
  1. struts.properties中进行修改
    在这里插入图片描述
  2. web.xml中进行修改
    在这里插入图片描述

5、分模块开发配置

(1) include的配置

<struts>
	<!-- 配置Struts2的常量 -->
	<constant name="struts.action.extension" value="action"/>
	
	<!-- 分模块开发配置 -->
	<include file="cn/itcast/struts/demo1/struts-demo1.xml"/>
</struts>

五、Action的访问

1、Action的写法

(1) Action类是POJO的类

配置struts-demo2.xml

<action name="actionDemo1" class="cn.itcast.struts.demo2.ActionDemo1"></action>

方法:

public class ActionDemo1 {

	public String execute() {
		System.out.println("ActionDemo1执行了");
		return null;
	}
}

(2) Action类实现一个Action的接口

实现接口的这种方式提供了五个常量(五个逻辑视图的名称)

  • SUCCESS:成功
  • ERROR:失败
  • LOGIN:登陆出错页面跳转
  • NPUT:表单校验的时候出错
  • NONE:不跳转

配置struts-demo2.xml

<action name="actionDemo2" class="cn.itcast.struts.demo2.ActionDemo2"></action>

方法:

public class ActionDemo2 implements Action{

	@Override
	public String execute() throws Exception {
		System.out.println("ActionDemo2执行了");
		return null;
	}
}

(3) Action类继承ActionSupport类

推荐使用ActionSupport方式,因为ActionSupport中提供了数据校验、国际化等一系列操作的方法
配置struts-demo2.xml

<action name="actionDemo3" class="cn.itcast.struts.demo2.ActionDemo3"></action>

方法:

public class ActionDemo3 extends ActionSupport{

	@Override
	public String execute() throws Exception {
		System.out.println("ActionDemo3执行了");
		return null;
	}
}

2、Action的访问

(1) 通过method设置

配置对应的struts-demo3.xml文件

	<!-- 配置Struts2的包====== -->
	<package name="demo3" extends="struts-default" namespace="/">
		<!-- 配置Action==== -->
		<action name="userFind" class="cn.itcast.struts.demo3.UserAction" method="find"></action>
		<action name="userUpdate" class="cn.itcast.struts.demo3.UserAction" method="update"></action>
		<action name="userDelete" class="cn.itcast.struts.demo3.UserAction" method="delete"></action>
		<action name="userSave" class="cn.itcast.struts.demo3.UserAction" method="save"></action>
	</package>

对应的Action类方法:

public class UserAction extends ActionSupport{
	
	public String find() {
		System.out.println("查询用户。。。");
		return NONE;
	}
	
	public String update() {
		System.out.println("更新用户。。。");
		return NONE;
	}
	
	public String delete() {
		System.out.println("删除用户。。。");
		return NONE;
	}
	
	public String save() {
		System.out.println("保存用户。。。");
		return NONE;
	}
}

(2) 通过通配符的方式进行配置(***)

配置对应的struts-demo3.xml文件

	<!-- 通配符的方式 -->
	<action name="product_*" class="cn.itcast.struts.demo3.ProductAction" method="{1}"></action>

对应的jsp页面

<h3>通过通配符的方式</h3>
<a href="${ pageContext.request.contextPath }/product_find.action">查询商品</a><br/>
<a href="${ pageContext.request.contextPath }/product_update.action">修改商品</a><br/>
<a href="${ pageContext.request.contextPath }/product_delete.action">删除商品</a><br/>
<a href="${ pageContext.request.contextPath }/product_save.action">保存商品</a><br/>

执行流程:
在这里插入图片描述

(3) 动态方法访问

配置对应的struts-demo3.xml文件

	<!-- 开启动态方法访问 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	<!-- 通过动态方法访问的方式 -->
	<action name="customer" class="cn.itcast.struts.demo3.CustomerAction"></action>

编写访问路径(在jsp文件中编写)

  • 格式:action中的name名+!+方法名
<h3>通过动态方法访问的方式</h3>
<a href="${ pageContext.request.contextPath }/customer!find.action">查询客户</a><br/>
<a href="${ pageContext.request.contextPath }/customer!update.action">修改客户</a><br/>
<a href="${ pageContext.request.contextPath }/customer!delete.action">删除客户</a><br/>
<a href="${ pageContext.request.contextPath }/customer!save.action">保存客户</a><br/>

六、CRM的客户列表显示

1、 搭建环境

(1) 创建web项目,引入jar包

  • Struts2
  • Hibernate

(2) 引入配置文件

  • Struts
    • struts.xml
    • web.xml
  • Hibernate
    • 核心配置
    • 映射文件
    • 日志文件

(3) 创建数据库和表

创建表

CREATE TABLE `cst_customer` (
  `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

(4) 创建包结构

在这里插入图片描述

(5) 引入相应的页面

2、代码实现

(1) 修改请求路径

<TR> 
    <TD class=menuSmall><A class=style2 href="/struts2_crm/customer_find.action"
		target=main>- 客户列表</A></TD>
</TR>

(2) 编写Action、Service、DAO

  1. Action
public class CustomerAction extends ActionSupport{

	public String find() {
		//调用业务层
		CustomerService customerService = new CustomerServiceImpl();
		List<Customer> list = customerService.find();
		// 页面条状
		ServletActionContext.getRequest().setAttribute("list", list);
		return "findSuccess";
	}
}
  1. Service
public class CustomerServiceImpl implements CustomerService {

	@Override
	public List<Customer> find() {
		// 调用DAO
		CustomerDao customerDao = new CustomerDaoImpl();
		return customerDao.find();
	}
}
  1. DAO
public class CustomerDaoImpl implements CustomerDao {

	@Override
	public List<Customer> find() {
		Session session = HibernateUtils.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		
		List<Customer> list = session.createQuery("from Customer").list();
		
		transaction.commit();
		return list;
	}
}

(3) 配置Action

<package name="crm" extends="struts-default" namespace="/">
		<action name="customer_*" class="cn.itcast.web.action.CustomerAction" method="{1}">
			<result name="findSuccess">/jsp/customer/list.jsp</result>
		</action>
	</package>

(4) 编写页面

  此处略去。。。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值