Struts学习笔记(一)入门&常见配置

1.Struts2框架概述

Struts2是一种基于MVC模式的轻量级web框架,本质上相当于一个servlet,在MVC设计模式中Struts作为控制器来建立模型与视图的数据交互。
Struts2以webwork为核心,采用拦截器机制来处理用户请求,使得业务逻辑控制器能够与servletAPI完全脱离开

1.1常见的web层框架

Struts1
Struts2
Webwork
SpringMVC

web层框架都有一个特点:基于前端控制器模式实现

1.2前端控制器

前端控制器
传统请求,有一个请求就对应一个servlet,这样会导致有很多servlet
好一点的会把一个实体各种操作集中在一个servlet里面并通过method来指定
而Struts2中将所有请求都先经过一个前端控制器,在控制器中实现框架的部分功能,剩下的具体操作再提交到action中。而前端控制器的实现是通过过滤器来做的。

2.Struts2入门

2.1Struts2配置文件的加载顺序

每次客户端发来的请求先经过Struts2的核心过滤器StrutsPrepareAndExecuteFilter(需要在web.xml中配置)的预处理(init方法)和执行(doFilter方法)
在这里插入图片描述
在init方法中调用了init的initDispatcher方法来加载配置文件
在这里插入图片描述
这边一系列的代码就是用来加载Struts2的配置文件的

init_DefaultProperties(); // [1]加载Struts2所有常量
init_TraditionalXmlConfigurations(); // [2]加载struts-default.xml、struts-plugin.xml、struts.xml
init_LegacyStrutsProperties(); // [3]加载用户自定义struts.properties
init_CustomConfigurationProviders(); // [5]加载用户配置的提供对象
init_FilterInitParameters() ; // [6]加载web.xml
init_AliasStandardObjects() ; // [7]加载标准对象

所以可以看出配置文件的加载顺序是这样的

default.properties
struts-default.xml
struts-plugin.xml
struts.xml  配置Action以及常量
struts.properties   配置常量
web.xml    配置核心过滤器以及常量

这里面我们能修改的就是后面三个。
这三个文件都可以修改Struts2的常量的值,后加载的常量会覆盖前面的赋值

2.2package配置
	<package name="demo1" extends="struts-default" namespace="/">
		<!-- 配置Action -->
		<action name="hello" class="com.itheima.struts.demo1.HelloAction">
			<!-- 配置页面的跳转 -->
			<result name="success">/demo1/success.jsp</result>
		</action>
	</package>

常用属性

Struts2的核心组件是action和拦截器,使用包来管理它们,每个包就是多个action+多个拦截器+多个拦截器引用的集合。
name:这个包的名字
namespace:命名空间,有三种
—>1.默认 “”
—>2.根名称空间 “/”
—>3.带名称的名称空间 “/demo1”
extends:继承自其他包,一般就默认struts-default,它里面有很多现成的拦截器
abstract:抽象包可被继承,不能包含action定义

2.3Action配置

name:标识action,指定了action所处理的请求的URL
class:指定action所对应的action类
method:指定请求action时调用的方法
converter:指定类型转换器的类
namespace和name一起决定了访问路径,class是action类的全路径,method是具体的哪个方法(默认是execute)

2.4Struts2常量的配置

1.在struts.xml中配置:这种最常用

<struts>
	<constant name="struts.action.extension" value="action_v1" />
	<include file="com/itheima/struts/demo1/struts_demo1.xml"  />
	<include file="com/itheima/struts/demo2/struts_demo2.xml"  />
	<include file="com/itheima/struts/demo3/struts_demo3.xml"  />
</struts>

2.在struts.properties中配置

struts.action.extension=action_v2
//这里就是自定义了扩展名

3.在web.xml中修改

  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  	<!-- 修改常量 -->
  	<init-param>
		<param-name>struts.action.extension</param-name>
		<param-value>action_v3</param-value>
  	</init-param>
  </filter>
2.5分模块开发

struts.xml是核心配置文件,比较重要。开发中常常多人合作,所以使用元素在struts.xml文件中包含其他配置文件,提高可读性。而struts2默认只加载classes下的struts.xml文件,一旦通过多个xml来配置action就必须要用include组合

<struts>
	<constant name="struts.action.extension" value="action" />
	<include file="com/itheima/struts/demo1/struts_demo1.xml"  />
	<include file="com/itheima/struts/demo2/struts_demo2.xml"  />
	<include file="com/itheima/struts/demo3/struts_demo3.xml"  />
</struts>
2.6Action编写

1.普通pojo类

package com.itheima.struts.demo2;
//action的第一种编写方式:action是一个pojo类
public class ActionDemo1 {
	public String execute() {
		System.out.println("ActionDemo1执行了...");
		return null;
	}
}

2.实现action接口

package com.itheima.struts.demo2;
import com.opensymphony.xwork2.Action;
//action的第2种编写方式:action实现一个Action接口
//这种方式提供了5个常量:五个逻辑视图的名称
/*
SUCCESS:	成功
ERROR:		失败
LOGIN:		登录出错的页面跳转
INPUT:		表单校验的时候出错、类型转换出错
NONE:		不跳转
*/
public class ActionDemo2 implements Action{

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

}

3.继承ActionSupport类(最常用)

package com.itheima.struts.demo2;
import com.opensymphony.xwork2.ActionSupport;
//action的第2种编写方式:action继承ActionSupport类
/*
	推荐使用继承方式
		ActionSupport中提供了数据校验、国际化等一系列操作的方法
*/
public class ActionDemo3 extends ActionSupport{
	@Override
	public String execute() throws Exception {
		System.out.println("ActionDemo3执行了...");
		return NONE;
	}
}
2.7Action的访问

1.传统的method方式
struts.xml中的配置

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

jsp中的访问链接

<h1>Action的访问</h1>
<h3>通过method方式</h3>
<a href="${pageContext.request.contextPath }/userFind.action">查询用户</a><br/>
<a href="${pageContext.request.contextPath }/userUpdate.action">修改用户</a><br/>
<a href="${pageContext.request.contextPath }/userDelete.action">删除用户</a><br/>
<a href="${pageContext.request.contextPath }/userSave.action">保存用户</a><br/>

Action的代码

package com.itheima.struts.demo3;
import com.opensymphony.xwork2.ActionSupport;
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;
	}
}

这种方式有个毛病:每个method都要配一次,就很麻烦
2.使用通配符(最常用)

<package name="demo3" extends="struts-default" namespace="/">
		<!-- 通配符的方式来配置 -->
		<action name="product_*" class="com.itheima.struts.demo3.ProductAction" method="{1}"></action>
</package>
<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/>

jsp中的product_find请求发送过来,与product_*匹配,而find则作为method的填充值

更抽象的写法
<action name="*_*" class="com.itheima.struts.demo3.{1}" method="{2}">
//下划线前面的单词会匹配action的类名,后面的单词匹配action里面的方法,更加简洁

3.动态访问
首先需要开启动态方法,设置常量
主要的控制是在页面端,所有action的配置都很简单,关键是访问路径的编写

<struts>
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	<package name="demo3" extends="struts-default" namespace="/">
		<!-- 动态方法访问的方式来配置 -->
		<action name="customer" class="com.itheima.struts.demo3.CustomerAction"></action>
	</package>
</struts>

访问路径的写法

<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/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值