Struts学习之day01

来源:互联网 发布:淘宝卖家盗用我的图片 编辑:程序博客网 时间:2024/05/29 18:37


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

struts如何实现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");
}

}


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;
}

}


第六步:在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
    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>




























0 0
原创粉丝点击