Struts2简介
Struts2是一个工作在表现层的MVC的流程框架,它本质上相当于一个Servlet在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。
Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开。Struts相对于WebWork差别不大,相对于Struts1差别很大
MVC设计模式
M(Model):模型包含数据模型和业务模型(JavaBean,业务逻辑)
V(View):视图,将不同的数据展示到页面上
C(Controller):控制请求处理(接收请求,处理请求,响应结果)它作为数据库与视图之间的一个媒介存在,将对数据库的操作和结果的显示分离。
MVC模式流程:
请求与响应的过程
【1】提交请求,提交数据
方式:
地址栏:http://ip:port/contextPath/index.jsp
表单:收集客户端数据
链接:<a href="/contextPath/userServlet?username=xiaoma&age=22">请求</a>
异步JS:ajax
【2】接收请求,接收数据
方式:
String value = request.getParameter("key");
将接收的数据封装成模型对象
【3】视图跳转,传递数据
跳转方式:
转发:
request.getRequestDispatcher("资源路径").forWard(requeset,response);
重定向:
response.sendRedirect("资源路径");
将数据保存到域对象中进行传递
常用域对象
request (HttpServletRequest ), session(HttpSession ) ,application(ServletContext )
【4】展示数据
使用JSTL/EL在JSP页面展示保存在域对象中的数据
原生webMVC【2】【3】都是由Servlet完成
框架
将通用代码封装起来,提供程序员开发使用,可以大大提高开发效率。
程序员只需要将开发重点放在业务逻辑的实现上,不用再去花费精力解决公共的问题了。
重复性,扩展性,稳定性...
Struts2具备核心功能
①可以将请求数据封装模型对象
②拦截器
文件上传
国际化
表单数据验证
类型转换
表单重复提交
...
③Action 处理请求,作用相当于Servlet
④Result 封装跳转方式
⑤支持多种视图技术:JSP , Freemarker
⑥ValueStack 存储数据
⑦Ognl 类似EL,用于操作数据
...
框架整体核心结构
apps框架给我们提供的学习案例
docs框架文档
lib框架类库
src框架源码
国际惯例---HelloWorld(使用Struts2框架)
1.框架环境搭建
①导入 jar
参考案例:\struts-2.3.15.3\apps\struts2-blank...
asm-3.3.jar
asm-commons-3.3.jar
asm-tree-3.3.jar
commons-fileupload-1.3.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.3.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
log4j-1.2.17.jar
ognl-3.0.6.jar
struts2-core-2.3.15.3.jar
xwork-core-2.3.15.3.jar
②新建一个conf专门放配置文件,文件名为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>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<!--这里在完成helloworld的时候写-->
</package>
</struts>
③在web.xml中配置核心控制器
<!-- 核心控制器 -->
<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>
2.完成HelloWorld
①index.jsp(发送请求)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 使用绝对路径访问 -->
<a href="${pageContext.request.contextPath}/hello">Hello</a>
</body>
</html>
②HelloWorldAction(处理请求)
package com.atguigu.action.hello;
public class HelloWorld {
public String hello() {
System.out.println("接收到请求");
return "success";
}
}
③配置action(就写在
struts.xml的page标签中,这主要完成页面转换
)
<?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>
<constant name="struts.devMode" value="true" />
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="com.atguigu.action.hello.HelloWorld" method="hello">
<result>/success.jsp</result>
</action>
</package>
</struts>
④成功页面success.jsp(切换的页面)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>向Struts2的工作者致敬</h1>
</body>
</html>
①Action程序代替Servlet来处理请求。
②就是一个普通的JavaBean程序,可以不用继承任何父类,可以不用实现任何接口。
③多实例。每一次请求都会创建一个新的Action对象。目的:解决线程安全问题。(Action类通过声明成员变量,来获取请求参数,当多个请求共用一个成员变量会发生线程安全问题)
④Action类中可以存在多个处理请求的方法。至少有一个。
⑤Action可以提供请求参数名称的set方法来接收请求参数。对于简单类型,可以可以自动的进行类型转换。
⑥处理请求的方法声明规则:
必须public
必须返回类型String
必须是无参数的
异常声明可以省略的
方法名称,一般与<action>标签的method属性值一致。否则,会查找默认execute方法来处理请求。
ActionSupport(com.opensymphony.xwork2.ActionSupport)
在编写Action类时,可以选择继承框架提供ActionSupport父类。
Action, 可以获取5个常量支持,代码编写规范化。
ValidationAware, 框架验证(通过框架配置文件来对表单数据进行验证)
TextProvider, 用于操作国际化资源文件
LocaleProvider, 用于获取Locale对象
当需要实现表单验证,国际化,序列化功能时,需要继承ActionSupport来获取框架支持。否则,不需要继承。
Strurts2框架配置解释
1.常量标签解释
常量标签:constant
name=struts.devMode : 开发模式
作用:①开发阶段一般设置为true,便于对问题的解决。
②修改配置后,不需要重新启动服务器,框架会自动识别配置文件是否修改过,如果修改过会自动重新加载。
<constant name="struts.devMode" value="true" />
框架核心jar包(struts2-core-2.3.15.3.jar)中含有org/apache/struts2/default.properties属性文件。定义了框架默认用到属性值。
可以使用constant常量标签对框架默认属性值进行修改。
2.package标签
package标签用于管理action等配置。
name : 设置包的名称。应该具有唯一性。
namespace :名称空间.用于分区不同包下的同名的action.相当于访问的路径。
如果定义了名称空间,那么,在请求的路径中就一定使用名称空间来访问action
namespace+ action的name值就是请求路径
extends : 用于包之间的继承。
struts-default 包是框架定义的默认父包。我们的包一般都是需要继承这个父包的。否则,无法使用框架提供帮助。
例如:结果类型,拦截器,拦截器栈,默认拦截器引用,默认的Action类引用就都无法使用了。
abstract="true" 表示声明一个抽象的包。抽象包一般是用于给子包做继承使用的。不能定义action配置。
<package name="default" namespace="/" extends="struts-default">
<!--这里在完成helloworld的时候写-->
</package>
3.action标签
action标签用于声明action的映射配置。将请求uri和目标Action类关联在一起。写在page标签中
在同一个命名空间下,不能定义同名的action.否则,只执行最后一个。
class : 处理请求Action类的全类名。
class属性可以省略。默认值是com.opensymphony.xwork2.ActionSupport,默认处理请求方法execute
当系统跳转成功页面,不需要进行任何业务逻辑处理时,可以通过默认ActionSupport进行请求处理。
method :如果省略,那么,框架会通过默认的方法名称来执行请求处理,默认方法名称:execute
<action name="hello" class="com.atguigu.action.hello.HelloWorld" method="hello">
<!--这里写result标签-->
</action>
4.result标签
result标签用于声明结果映射配置。将Action类方法返回结果字符串,与一个物理视图文件关联在一起
name : 表示结果名称。与Action类方法的返回结果字符串相匹配。
name="success" 默认值,可以省略
type : 表示结果类型。对不同的跳转方式进行封装。
type="dispatcher" : 用于转发。默认值,可以省略。
type="redirect" : 用于重定向
<result name="success" type="dispatcher">/success.jsp</result>
代码整理:
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>mystruts2_day01_helloword</display-name>
<!-- 配置一个核心控制器 -->
<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>
</web-app>
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>
<!--配置开发者模式-->
<constant name="struts.devMode" value="true" />
<!--
package
name用来定义包名,
namespace定义请求路径(namespace+action的name属性值共同构成请求路径)
extends="struts-default"必须写,否则不能获取Struts框架支持,例如request的处理,转发,重定向...
-->
<package name="com/atguigu/action/hello" namespace="/" extends="struts-default">
<!--
action标签
name属性设置请求名,与namespace共同构成请求路径(SpringMVC中加在类上@RequestMapping+加在方法上的@RequestMapping共同构成请求路径)
class表示方法所在的全类名,
method定义处理请求的方法名
-->
<action name="hello" class="com.atguigu.action.hello.HelloWorld" method="hello">
<!--
name属性设置返回值,里面的文本框设置跳转页面
type设置是重定向还是转发,默认是转发
type="dispatcher"用于转发。默认值,可以省略。
type="redirect"用于重定向
type类型不能随便设置,必须是struts2-core下struts-default.xml中设置的
-->
<result name="success" type="redirect">/success.jsp</result>
<!--重定向到目标资源
这里指定目标资源的虚拟路径时,不能包含Web应用的虚拟路径,
因为Struts2会自动添加,我们再加就是画蛇添足。
-->
</action>
</package>
</struts>
处理请求的Action类
package com.atguigu.action.hello;
public class HelloWorld {
/**
* Struts2通过定义成员变量(属性)来获取请求参数
* ①设置属性②定义set/get方法(Struts2通过使用setXXX方法给属性赋值,属性的名字不影响赋值操作)
* 若成员变量进行共享会出现线程安全性问题,Struts2通过使用多实例的方式来解决
* Struts2默认请求地址execute(返回成功页面)
*
*/
private int age;
/**
* 执行请求的方法,同时要在xml中配置
* 何时,如何执行这个请求
* @return
*/
public String hello() {
System.out.println("接收到请求");
System.out.println("请求参数age=" + age);
return "success";
}
public void setAge(int age) {
this.age = age;
}
}