Struts2 Note2

1. 为什么要用Struts *
  为什么要用Struts等框架技术?
    让我们的开发变的简单,节省项目成本。
  如何学习Struts等框架技术?
    先掌握如何使用,在使用的过程中逐步理解并掌握原理(打个比方,先学会开车,在开车过程中学习如何维护并修理汽车)

2.为什么要用Struts2框架技术?

   因为Struts2框架已经把MVC框架思想封装好了。

3.1. Struts 2历史 *
  最早出现的Struts1是一个非常著名的框架,它实现了MVC模式。Struts1简单小巧,其中最成熟的版本是Struts1.2。 乊后出现了WebWork框架,其实现技术比Struts1先  进,但影响力丌如Struts1。 在框架技术丌断发展过程中,有人在WebWork核心XWork的基础上包装了Struts1(算是两种框架的整合),由此,结合了Struts1的影响力和  WebWork的先进技术,Struts 2诞生了。 所以说,Struts2丌是Struts1的升级,它更像是WebWork的升级版本。

Struts2提供的方便乊处:

这个好像和Struts1不一样,Struts1需要有个ActionForm的bean 和jsp的表单匹配起来
  数据的自动的封装
    根据页面组件的name属性,自劢封装到Action中对应的name属性中。
    在Jsp页面<input name=’name’ type=’text’/> 在action中会自劢给属性private     Stringname   赋值 数据的自动的传递
    Action中得属性会在jsp页面可以直接用EL表达式拿到 Action中属性private String name; 在jsp页面上可以直接${name}的到对应的值

数据的自动的传递
    Action中得属性会在jsp页面可以直接用EL表达式拿到
       Action中属性private String name;
          在jsp页面上可以直接${name}的到对应的值

3.3. Action的小结 *

  在Struts2框架中,我们写一个Action

    class FooAction {}

  一般情况下,在该类中有一个public String execute()方法

  ·  class FooAction { public String execute() {} }

execute()方法通过返回丌同的String决定转到哪个页面

    class FooAction { public String execute() { return "success"; //return "abc";亦可 } }

我们为该Action添加成员变量name 注意:
    1) 只有当为成员变量添加get/set方法时,我们才称该成员变量是类的属性
    2) 所有的属性都会被“带”到页面(在页面能够使用)
    3) 在页面form表单中提交的信息可以赋值给属性

对不一般的Action有2种属性
1) 第1种,用来接收用户的提交 input属性
2) 第2种,用来把数据带给视图(JSP)output属性

  public class ProjectListAction {

     // input属性

    private int page = 1;

4. 关于Struts中的Action
  Struts2和Struts最大的区别就是:
    Struts2每次都会创建一个新的Action.
    Struts每次 用的都是同一个Action

  1) Action基本原理 *
      每次請求都会创建一个新的Action的实例,因为每次请求都对应一个单独的Action,所以丌需要考虑线程安全问题。
      Action对象将置于ValueStack的栈顶
      Action的业务方法(默认为execute)根据输入算输出

  2) 在Action中如何访问Session&Application
      使用ActionContext访问Session

  

      session, application 将存放在ValueStack的Context中

     


  通过实现SessionAware接口访问session (更好)
    首先,新建BaseAction implements SessionAware
    其次,所有需要session的XXXAction extends BaseAction
    类似的,还有: ServletRequestAware ServletResponseAware ServletContextAware

不推荐使用ActionContext访问Session的方式,因为这种方式的“侵入性”较强。
ActionContext是Struts2的API,如果使用其他框架代替目前的Struts2框架,而我们 实际顷目中的Action的数量非常庞大,每个类都修改会很费劲。

(为什么一定要用Struts2的ActionContext, 像普通的Servlet那样去访问Session不就行了吗? AnyWay, 下面的替换方案还是很有启发的)

 第2种方法(推荐)
通过实现SessionAware接口访问session
12) 新建BaseAction

该类实现了SessionAware接口,表明Struts2在启劢BaseAction时,
首先,创建出该Action的对象,放入“栈顶”
然后,会调用BaseAction的setSession方法,把session传入给BaseAction对象
(注意:如果是普通的Action,Struts2在启劢时仅创建出该Action的对象,然后放入“栈顶”)
 
由此,我们定义了属性session,以便在之后其他的方法中使用。
为了让子类也能使用,所以访问 控制符为protected。
 
按照这样的机制,我们可以让所有的Action(如LoginAction)继承实现了SessionAware接口 的BaseAction,
当需要更换Struts2框架为其他框架时,只需要修改BaseAction即可
(另外的 框架只要提供一个类似SessionAware接口的接口,由BaseAction继承)

例子分析:

1.在JSP页面中只要写user.username 就能直接传到Action中的user属性然后调用setUsername()方法?这是struts2做的? 并没有用任何标签

还有,返回到页面以后直接用<s:property value="user.username"就能访问到session中的“day3.user”的值了?即使它会自己根据属性名称

去找,但是如果session里面有两个属性名称一样的对象会怎么取?这就意味着这些框架虽然封装了很多东西看起来很方便,但其实学习成本比较高

这些框架设置的规则都要靠比较长时间的尝试总结出来,每个框架之间又都大同小异。。。异虽小,但对讲究速度的互联网开发来说已经比较耗时了。没办法

从项目长远考虑,大家也都在用,只能花一定的时间熟练起来,希望过了一个坎以后就好了吧。

2.

4.5 在result的配置中使用OGNL表达式

时间: 2024-08-27 12:20:31

Struts2 Note2的相关文章

解决myeclipse中struts2 bug问题包的替换问题

因为struts2的bug问题,手工替换还是比较麻烦,但即便是最新的myeclipse2014也没有替换最新的struts2包,研究了一天,终于找到了解决办法.以下就解决方法与大家分享一下. 1.在perferences中找到 Myeclipse->Project Libraries,右边找到 struts2.1 Libraries,点击 Enable advanced configiguration,去掉以下文件前面的对勾,然后点击 Add custom Jars 2.在弹出的对话框中选择 A

【Struts2】SSH如何返回JSON数据

  在开发中我们经常遇到客户端和后台数据的交互,使用比较多的就是json格式了.在这里以简单的Demo总结两种ssh返回Json格式的数据 项目目录如下 主要是看 上图选择的部分 WebRoot里面就是平常的配置 第一种方法是使用com.google.gson.Gson 将对象转化为Json字符串  (gson-1.6.jar) 主要的代码如下 1 package com.javen.tool; 2 3 import java.io.IOException; 4 import java.io.P

struts2 版本所导致的 Filter 不同

过了好久又重新接触Struts2,使用maven直接获取的struts2-core-2.5.1的包,从网上直接copy了一段web.xml中的Filter,结果报错,struts2.3.x  以后用以下配置: 1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExe

Struts2学习第三课 访问Web资源

1.什么是WEB资源? HttpServletRequest,HttpSession,ServletContext等原生的Servlet API. 2.为什么访问WEB资源? B/S的应用的Controller中必然需要访问WEB资源,例如,向域对象中读写属性,读写Cookie,获取realPath等等. 3.如何访问? 在Action中,可以通过一下方式访问web的HttpSession,HttpServletRequest,HttpServletResponse等资源 与Servlet AP

struts2+hibernate+spring简单整合且java.sql.SQLException: No suitable driver 问题解决

最近上j2ee的课,老师要求整合struts2+hibernate+spring,我自己其实早早地有准备弄的,现在都第9个项目了,无奈自己的思路和头绪把自己带坑了,当然也是经验问题,其实只是用myeclipse进行整合的,本来也没那么多问题,看视频吧居然好多要手打,我不喜欢看不下去放弃了,教程把就是一堆坑,最最让人不解的是明明有一个冲突是需要解决的,但我看到的教程居然都没有提到,还有一个错误居然好多人都好像自动忽略一样,能解决我问题的都是要漫长的找,所以我一定一定要把这个过程记录下来,给第一次搞

SSH Struts2+hiberante+Spring整合

使用SSH框架编写学生信息: 一.新建Java工程: (1)建立好Java各层级之间的结构:业务处理层dao,数据模型层domain,页面请求处理层(Struts2 MVC层)action,service层. (2)建立好各层的实现类及接口; (3)建立一个source folder文件夹,用来存放一些配置问价. (4)改变字节码生成的位置,改为WEB-INF下面的classes文件夹下. Java工程层级结构如下图: 二.hibernate整合到Spring容器中 步骤: 1.编写domain

Struts2 中的值栈的理解

通过对struts2的一段时间的接触,将自己对OGNL的核心值栈说说,值栈:简单的说,就是存放action的堆栈,当我们提交一个请求道服务器端 action时,就有个堆栈,如果action在服务器端进行跳转,所有action共用一个堆栈,当需要保存在action中的数据时,首先从栈顶开始 搜索,若找到相同的属性名(与要获得的数据的属性名相同)时,即将值取出,但这种情况可能出现找到的值不是我们想要的值,那么解决此问题需要用TOP语法 和N语法来进行解决. 当在客服端进行跳转时,当有请求提交到服务器

struts2和hibernate整合的小Demo

jar包下载地址 创建一个web项目. 导入jar包 配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="

配置struts2+spring,springmvc

Struts2+Spring整合 一.spring负责注入,struts2负责它自己的工作.这样不是很符合spring作为ioc容器的全部功能,不推荐. 二.spring负责全部bean和struts2的action的生成.作为ioc容易的最大共用. 所需要jar包 配置web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/