struts2的概念
struts2是轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表示层。
轻量级:低侵入性,与业务代码的耦合度低。即业务代码中不需要import它的包。
MVC框架:struts实现了MVC,并提供了一系列API,采用模式化方式简化业务开发过程。
什么是MVC?
MVC是一种设计模式,是一种代码的分层思想。将代码分为三层:模型、视图、控制器,作用是将代码解耦,便于团队开发。
模型(Model)的职责是负责业务逻辑。包含两层:业务数据和业务处理逻辑。比 如实体类、DAO、service都属于模型层。
视图(view)是负责显示界面和用户交互。属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
控制器(Controller)是模型层M与视图层V之间的桥梁,用于控制流程,比如:在在Servlet项目中的单一控制器ActionServlet。
struts2的缺点:
1.效率偏低,struts2中的action是非单例的,每次请求都需要new对象。
2.有安全漏洞,容易被注入式攻击。
struts1和struts2的区别:
struts2是struts的下一代产品,是在struts1和WebWork的技术基础上进行了合并
的全新的MVC框架。
struts2和struts1差别巨大,不能理解为struts1的升级版。
struts2是以Xwork为核心,可以理解为WebWork的升级版。
struts:
-->filter-->struts.xml-->Action-->DAO--->Entity
spring:
-->DispactherServlet-->applicationContext.xml-->Controller-->DAO-->Entity
开发顺序:
-->DAO-->业务控制器(Controller,Action)-->配置(applicationContext.xml,struts.xml)-->JSP
轻量级:低侵入性,与业务代码的耦合度低。即业务代码中不需要import它的包。
MVC框架:struts实现了MVC,并提供了一系列API,采用模式化方式简化业务开发过程。
什么是MVC?
MVC是一种设计模式,是一种代码的分层思想。将代码分为三层:模型、视图、控制器,作用是将代码解耦,便于团队开发。
模型(Model)的职责是负责业务逻辑。包含两层:业务数据和业务处理逻辑。比 如实体类、DAO、service都属于模型层。
视图(view)是负责显示界面和用户交互。属于视图的组件是不包含业务逻辑和控制逻辑的JSP。
控制器(Controller)是模型层M与视图层V之间的桥梁,用于控制流程,比如:在在Servlet项目中的单一控制器ActionServlet。
struts2的缺点:
1.效率偏低,struts2中的action是非单例的,每次请求都需要new对象。
2.有安全漏洞,容易被注入式攻击。
struts1和struts2的区别:
struts2是struts的下一代产品,是在struts1和WebWork的技术基础上进行了合并
的全新的MVC框架。
struts2和struts1差别巨大,不能理解为struts1的升级版。
struts2是以Xwork为核心,可以理解为WebWork的升级版。
struts:
-->filter-->struts.xml-->Action-->DAO--->Entity
spring:
-->DispactherServlet-->applicationContext.xml-->Controller-->DAO-->Entity
开发顺序:
-->DAO-->业务控制器(Controller,Action)-->配置(applicationContext.xml,struts.xml)-->JSP
s truts如何实现MVC?
struts实现MVC的方式基本上与Spring一致,主要是实现方式上有一些差异,struts采用filter+Action来充当控制器(Controller)。其中filter是前端控制器,负责处理请求的分发,它会根据配置文件struts.xml中的预置内容,把每一类请求分发给特定的Action类,而每一个Action类负责处理一类请求。这样不同的请求,通过filter分发给不同的Action类来处理,从而将请求的处理自然的拆开,,大大降低控制器(Controller)处理请求代码的耦合度,提升了代码的可维护性。
struts的使用步骤:
大致步骤:
针对struts实现MVC的图示,我们来分析一下struts开发所涉及的组件及大致步骤,具体步骤请见后面的详细步骤说明。
1.struts框架下,请求需要提交给filter,而这个filter需要在web.xml中进行配置。对于filter这个组件不需要我们自己实现,struts提供了一个默认的filter供我们
使用,该filter名为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。
2.filter的目的是将请求分发给业务控制器Action,而找到每类请求对应的Action需要提前预置在struts.xml中,即我们需要在struts.xml中预置请求与Action的关系。
3.filter依赖struts.xml找到Action类之后,会自动实例化Action,并调用Action的业务方法,因此我们需要针对每类请求创建Action,并在业务方法中实现当前业务
的逻辑代码。
4.Action在实现业务逻辑时,往往需要调用访问数据库、调用业务组件等,因此我们需要提前实现DAO、业务组件。
5.Action在处理完业务逻辑之后,filter需要再将请求转发给JSP,由JSP负责显示处理的结果。因此,我们需要在struts.xml中配置每类Action转发的JSP,并创建
JSP实现显示代码。
具体步骤:
第一步:创建WEB项目
第二步:导入struts核心包(5个)
第三步
:配置前端控制器
struts使用filter来充当前端控制器,因此在web.xml中配置一个filter即可。struts预置;了该filter的实现类,来自于struts的jar包,名为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter。
引入struts框架后,希望所有的请求都由它的filter来处理,因此使用"/"来指定该filter处理所有请求。
第四步:在src下,创建名为struts.xml的配置文件
1.struts配置文件默认要放在src下。
2.struts配置文件默认名称为struts.xml。
第五步:编写业务控制器Action
创建业务控制器组件,通常命名为XxxAction,该组件是一个满足JavaBean规范的类。
在Action中定义业务方法,要满足下列条件:
1.方法是public的
2.返回值为String类型的
3.参数列表为空
编写业务方法:
1.方法内编写业务逻辑代码
2.返回字符串与struts.xml中的action标签下的result标签的name属性匹配,即根据此返回值找到对应的 result。
package org.tarena.action;
import org.tarena.entity.User;
/**
* Action是Struts2的业务控制器,等价于SpringMVC中Controller,在这里写业务代码。
*
*/
public class HelloAction {
//基本属性
private String realName;
//域模型
private User user;
public HelloAction(){
System.out.println("实例化Action");
}
/**
* Action的业务方法,用于处理请求中的业务,有三点要求:
* 1.必须是public
* 2.返回值为String
* 3.参数列表为空
*/
public String sayHello(){
//模拟业务逻辑
System.out.println("Hello Action");
//输出基本属性值
System.out.println("姓名:"+realName);
//输出域模型值
System.out.println("用户名:"+user.getUserName());
System.out.println("密码:"+user.getPassword());
/*
*返回的字符串用于匹配一个result标签,然后请求转发给result标签中定义的页面。
*
*/
return "OK";
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
System.out.println("注入realName");
}
}
import org.tarena.entity.User;
/**
* Action是Struts2的业务控制器,等价于SpringMVC中Controller,在这里写业务代码。
*
*/
public class HelloAction {
//基本属性
private String realName;
//域模型
private User user;
public HelloAction(){
System.out.println("实例化Action");
}
/**
* Action的业务方法,用于处理请求中的业务,有三点要求:
* 1.必须是public
* 2.返回值为String
* 3.参数列表为空
*/
public String sayHello(){
//模拟业务逻辑
System.out.println("Hello Action");
//输出基本属性值
System.out.println("姓名:"+realName);
//输出域模型值
System.out.println("用户名:"+user.getUserName());
System.out.println("密码:"+user.getPassword());
/*
*返回的字符串用于匹配一个result标签,然后请求转发给result标签中定义的页面。
*
*/
return "OK";
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getRealName() {
return realName;
}
public void setRealName(String realName) {
this.realName = realName;
System.out.println("注入realName");
}
}
package org.tarena.entity;
public class User {
private String userName;
private String password;
public User(){
System.out.println("实例化User");
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
System.out.println("设置userName");
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public class User {
private String userName;
private String password;
public User(){
System.out.println("实例化User");
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
System.out.println("设置userName");
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第六步:在WebRoot下创建hello.jsp页面,在上面编写显示部分的代码。
第七步:在struts.xml中配置请求与Action的关系,并在action下,通过result设置转发的页面。
<?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>
<!-- 该配置需要体现两点内容:1.请求对应哪个Action类及方法 2.请求转发到哪个页面 -->
<!--
name:是package的名称,用于引用package
一般情况下,一个模块用一个package来配置。
-->
<package name="day01" namespace="/demo" extends="struts-default">
<!-- 访问http://localhost:8888/struts_day01/demo/hello.action -->
<!--
name:声明的组件名,用于找到Action类。一个package下可以配置多个action标记,他们之间不能重名(name)。
class:Action类名。
method:要调用Action类中的方法。
-->
<action name="hello" class="org.tarena.action.HelloAction" method="sayHello">
<!--
result:用于转发的页面。
name:是result标签的名称,用于匹配Action方法的返回值。每个action下可以匹配多个result,但他们之间不能重名。
-->
<result name="OK">/hello.jsp</result>
</action>
</package>
</struts>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<!-- 该配置需要体现两点内容:1.请求对应哪个Action类及方法 2.请求转发到哪个页面 -->
<!--
name:是package的名称,用于引用package
namespace:是package的命名空间,用于访问一个package,以"/"开头。extends:是指继承于某个package,继承这个package相当于把这个package下所配置的内容复制到当前package下。
一般情况下,一个模块用一个package来配置。
-->
<package name="day01" namespace="/demo" extends="struts-default">
<!-- 访问http://localhost:8888/struts_day01/demo/hello.action -->
<!--
name:声明的组件名,用于找到Action类。一个package下可以配置多个action标记,他们之间不能重名(name)。
class:Action类名。
method:要调用Action类中的方法。
-->
<action name="hello" class="org.tarena.action.HelloAction" method="sayHello">
<!--
result:用于转发的页面。
name:是result标签的名称,用于匹配Action方法的返回值。每个action下可以匹配多个result,但他们之间不能重名。
-->
<result name="OK">/hello.jsp</result>
</action>
</package>
</struts>