struts2入门

霸气de小男生 提交于 2020-03-08 04:22:46

struts2介绍

概念

前端框架,用于替代servlet处理访问服务器的请求。

使用优势

来自于https://www.w3cschool.cn/struts_2/struts_overview.html

  • POJO表单及POJO操作 - Struts2 去除掉了Struts框架中的Action Forms部分。在Struts2框架下,你可以用任何一POJO来接收表单输入,同样的,你可以把任一POJO视为一个Action类。
  • 标签支持 - Struts2 改进了标签表单,而新的标签可让开发人员减少代码编写量。
  • AJAX支持 - Struts2 被认可接收进Web 2.0技术,并创建了功能非常类似于标准的Struts2 标签的AJAX标签,把AJAX支持整合进其结果中。
  • 易于整合 - Struts有多种整合方式可使用,现在与其他类型的框架,如Spring、Tiles、SiteMesh之类的,整合更为容易了。
  • 模板支持 - 支持使用模板生成视图。
  • 插件支持 - 有大量的插件可用于Struts2,而使用插件可以增强和扩大Struts2 核心行为。
  • 性能分析 - Struts2 为调试和配置应用程序提供综合的性能分析,此外,Struts也以嵌入调试工具的形式提供集成调试。
  • 易于修改标签 - 在Struts2 中,可使用Freemarker的模板对标签标记进行调整,而修改标签不需要JSP或是Java知识,基本的HTML、XML和CSS知识就足够了。
  • 促进减少配置 - Struts2 使用各种设置的默认值促进减少配置,而你不需要再配置什么除非是偏离了Struts2 设定的默认设置。
  • 视图技术 - Struts2 为多种视图选项(JSP、Freemarker、Velocity、XSLT等)提供支持。

封装好的功能点

  • 自动封装参数
  • 参数校验
  • 结果的处理(转发|重定向)
  • 国际化
  • 显示等待页面
  • 表单的防止重复提交

sturts1和struts2

技术上没有什么关系,struts1的前端控制器是一个Servlet,名称为ActionServlet,struts2的前端控制器是一个filter。

struts2搭建

下载地址

https://struts.apache.org/download.cgi#struts2522

新建web项目

在这里插入图片描述

导入jar包

struts2_mini解压缩后lib中jar复制到项目中WEB-INF/lib中
在这里插入图片描述

书写Action类

package hello;

public class HelloAction {
	public String Hello(){
		System.out.println("Hello");
		return "success";
	}
}

新建xml并导入约束

在这里插入图片描述

导入约束

新建dtd文件夹用以保存我们的struts2所提供的dtd文件,因为struts2的dtd文件位于jar包内无法直接复制,只能在eclipse中打开后复制,并新建一个txt粘贴复制的内容,另存为dtd文件格式
在这里插入图片描述
struts2提供的dtd文件位置如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
再找到
在这里插入图片描述
复制
在这里插入图片描述
Add
在这里插入图片描述
再重新打开之前的xml,编辑xml,结果如下,具体按照自己的命名修改相应的字符串内容即可

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
	"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
	"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
	<package name="hello" namespace="/hello" extends="struts-default">
		<action name="HelloAction" class="hello.HelloAction" method="Hello">
			<result name="success">/hello.jsp</result>
		</action>
	</package>
</struts>

新建hello.jsp

在这里插入图片描述
自行修改内容即可,为了测试用,我在jsp中加了行显示文字的代码

将struts2核心过滤器配置到web.xml[最重要的一步

项目中没自动创建xml解决方法

如果没有,灰色部分会被激活,成为可选,直接选择添加即可
在这里插入图片描述
在web.xml下添加

<display-name>struts2</display-name>
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

给eclipse配置tomcat

将tomcat加入运行环境
在这里插入图片描述
将tomcat包导入项目Libraries
在这里插入图片描述
再选中tomcat
在这里插入图片描述
运行即可(还有一件事情,需要点击运行后在这些卡项中的server(我的删了就找不到了qwq)更改加载路径到tomcat的webapps中
在这里插入图片描述

运行结果

在这里插入图片描述

struts2访问流程

Created with Raphaël 2.2.0获得浏览器请求根据命名空间hello/HelloAction由过滤器去匹配配置文件有没有一个包的namespace为/hello?/hello包中有没有一个action name="HelloAction"?根据类的完整类名创建对象,并调用method方法并返回相应结果转发到hello.jsp内结束yesnoyesno

struts2架构

在这里插入图片描述

AOP编程思想

应用于servlet

在这里插入图片描述

应用于拦截器Interceptor

在这里插入图片描述

配置详解

struts.xml详解

<struts>
	<!-- package:将Action配置封装,即可以在package配置多action
		 name:给包起个名字,起到标识作用,随便起,不与其他包重名即可 比如/user标识用户域
		 extends:继承一个指定的包
		 abstract:包是否为抽象的,若是,则不能独立运行,专门用于被继承 
		                       比如struts2内置的 <package name="struts-default" abstract="true">
	 -->
	<package name="hello" namespace="/hello" extends="struts-default">
		<!-- action元素:配置action类
			 name:决定了Action可访问资源名
			 class:action的完整类名
			 method:指定调用Action哪个方法处理请求
		 -->
		<action name="HelloAction" class="hello.HelloAction" method="Hello">
			<!-- result:结果配置
				 name:表示结果处理的名称,与action方法的返回值对应
				 type:指定调用哪一个result类来处理结果,默认使用转发
				      <result-type name="dispatcher" class="org.apache.struts2.result.ServletDispatcherResult" default="true"/>
		    -->
			<result name="success">/hello.jsp</result>
		</action>
	</package>
</struts>

struts2常量配置

struts2默认常量配置位置

在这里插入图片描述

修改struts2常量配置(加载顺序为序号顺序

方式一:在struts.xml中修改(推荐方法)

<struts></struts>根目录下新建<constant name=" " value=" "></constant>
再将name设置为想修改的元素,value设置为想改为的值


<constant name="struts.i18n.encoding" value="GBK"></constant>

方式二:新建struts.properties修改

在项目/src下新建struts.properties
将想修改的常量复制到文件内修改即可
在这里插入图片描述

方式三:在web.xml中修改

加入如下代码块

<!-- 配置常量 -->
  <context-param>
  	<param-name>struts.i18n.encoding</param-name>
  	<param-value>GBK</param-value>
  </context-param>

常量说明

常量 默认 说明
struts.i18n.encoding UTF-8 设置编码方式
struts.action.extension action,, 指定访问action时的后缀名,默认配置两个一个为action,一个为空
struts.devMode = false false 指定访问struts是否以开发模式运行
<struts>
	<!-- 常量配置
		 i18n:国际化,即不同语言浏览器看到的语言不一样
		     可以解决post提交乱码,以及输出中文乱码
	 -->
	 <constant name="struts.i18n.encoding" value="GBK"></constant>
	 <!-- 常量配置
		 指定访问action时的后缀名,默认配置两个一个为action,一个为空
		     http://localhost:8080/struts2/hello/HelloAction.do
	 -->
	 <constant name="struts.action.extension" value="do"></constant>
	 <!-- 常量配置
		 指定struts是否以开发模式运行
		     1. 热加载主配置(不需要重启服务器即可更改生效)
		     2.提供更多错误信息,方便开发时调试
	 -->
	 <constant name="struts.devMode" value="true"></constant>
</struts>

struts2配置的进阶

动态方法调用

新建一个包及action类,并在新建包的路径下新建struts.xml
修改项目的struts.xml

<struts>
<!-- 引入其他struts配置文件 -->
	<include file="/dynamic/struts.xml"> </include>
</struts>

方式一:配置动态方法调用常量

新的struts.xml添加如下代码块

<struts>
	<!-- 配置动态方法调用常量 
		 http://localhost:8080/struts2/dynamic/DemoAction/add
	-->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	
	<package name="dynamic" namespace="/dynamic" extends="struts-default">
		<action name="DemoAction" class="dynamic.DemoAction">
			<result name="success">/hello.jsp</result>
		</action>
	</package>
</struts>

此时再根据action类中方法名填写路径即可。

方式二:通配符方式(推荐方法

<!--  方式二:通配符方式
			   _并非必须,只是为了代码规范
			   *代表通配,在填写路径时需要什么换成什么,由{1}取出第一个*所填写的方法
			   http://localhost:8080/struts2/dynamic/DemoAction_add
	-->
	<package name="dynamic" namespace="/dynamic" extends="struts-default">
		<action name="DemoAction_*" class="dynamic.DemoAction" method="{1}">
			<result name="success">/hello.jsp</result>
		</action>
	</package>

struts2的默认配置

<struts>
	<package name="dynamic" namespace="/dynamic" extends="struts-default">
		<!-- 找不到对应action会使用DemoAction作为action的默认请求 -->
		<default-action-ref name="DemoAction"></default-action-ref>	
		<!-- 默认配置
			 method属性:execute
			 result name:success
			 result type:dispatcher 转发
			 class:com.opensymphony.xwork2.ActionSupport
			  -->
		<action name="DemoAction_*" class="dynamic.DemoAction">
			<result name="success">/hello.jsp</result>
		</action>
	</package>
</struts>

action的创建方式

方式一:创建一个类,可以是POJO

POJO:不用继承任何父类,也不用实现任何接口
缺点:使struts框架侵入性更低

方式二:实现一个接口Action

优点:

  • Action接口预置了一些字符串,可以在返回结果时使用,更加方便
  • 里面有execute方法,提供action方法的规范
public class DemoAction implements Action{
	@Override
	public String execute() throws Exception{
		return null;
	}
}

方式三:继承一个类ActionSupport(最常用)

优点:

  • 帮我们实现了Validateable,ValidationAware,TextProvider,LocalProvider这些接口
public class DemoAction extends ActionSupport{

}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!