java的struts2整理

readbook:struts2

先说一下struts1:
    struts1使用model II 模式开发,即jsp+java bean+servlet
    再说它的缺陷:
    1.表现层支持单一,本来在java web应用的世界里,表现层技术选择时不一定必须选择jsp,其它视图层可用于替代选择的技术如 FreeMaker,Velocity等,
    但struts 1无法与其进行整合.
    2. 过度依赖servlet api
    servlet api需要web容器进行初始化,此时一旦脱离web 容器,整个程序很难完成测试.
    3.不利于代码重用
    在struts 1中的某些类(比如actionForm)耦合在一起的代码很难再其它系统中进行重用.

于是struts2改变思路,同时吸收struts 1的一些想法,以WebWork(java的另一个类似框架项目)的设计思想为核心进行了框架重构
    官网:http://struts.apache.org/

基础包
    struts2-core-xxx.jar             struts2框架的核心类库
    xwork-core-xxx.jar               xwork类库,struts2构建基础
    ognl-xx.jar                      struts2使用的一种表达式语言类库
    freemaker-xxx.jar                struts2的标签模板使用类库
    javassist-xxx.GA.jar             字节码处理
    commons-fileupload-xx.jar        文件上传时用到的
    commons-io-xx.jar                java IO 扩展
    Commons-lang-xx.jar              包含了一些数据类型的工具库
    commons-lang3-xx.jar             

如果用到了一些非基础类库里的类导致控制台报错提示类库缺失,可以根据信息引入框架内的其它相应类库

struts helloworld:
关于struts 的ognl(对象图导航语言)表达式语言

1.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>  <%-- 注释: 在jsp文件里增加这一行--%>
<html>
    <head>...</head>
    <body>
        ...
        <%-- 输出struts action中message的值 --%>
        <h1> <s:property value="message" /> </h1>

        <div class="row">
            <form action="HelloWorld.action" method="post">
                <input name="name" type="text"/>
                <input type="submit" value="提交"/>
            </form>
        </div>
    </body>
</html>

2.java类
写处理action逻辑代码
package com.bud.test;

import com.opensymphony.xwork2.Action;

public class HelloWorldAction implements Action {
    private String name = "";
    private String message = "";

    public String execute() throws Exception {
        // TODO Auto-generated method stub
        this.setMessage("hello,"+this.getName()+"!");
        return "success";
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

}

发生的事情,表单提交时,struts2来对请求参数进行转换,
同时依据约定由于配置的思想,直接对action中具有相同名字Action类属性赋值(通过setter方法)

Action的excute() return 五个常量

success  表示程序处理正常,并返回用户成功的结果
none     表示处理正常结束,但不返回用户客户端任何数据
error    表示处理结果失败
input    表示需要更多用户输入才能顺利执行
login    表示需要用户正确登录后才能顺利执行

以上5个常量是action默认支持逻辑视图的名称, 也支持扩展返回其它特定字符串作为逻辑视图名称

3.web.xml 配置 用于拦截所有请求 到struts2 上

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

notice:这里的 org.xxx 根据具体 struts2 core 的jar里的类去找

4.struts2的配置文件
在src路径下建立struts.xml
因为不同版本xml文档定义的问题 我下了对应版本的struts在它的示例app中拷了这个配置文件修改
不过如果用myeclipse的话,完全可以用项目上右键菜单MyEclipse-->Add Struts Capabilities...
不过这里讲原理就不用工具生成了
就我发现的规律文档定义一般也只会改 Configuration 2.3 dtds/struts-2.3.dtd  这里的第二位版本号而已,比如2.0,2.3之类

<?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">

<!-- START SNIPPET: xworkSample -->
<struts>
    <!-- 创建default包,继承struts-default包 -->
    <package name="default" namespace="/" extends="struts-default">
        <action name="HelloWorld" class="com.bud.test.HelloWorldAction">
            <result name="success">/test/hello-world.jsp</result>
        </action>
    </package>

</struts>
<!-- END SNIPPET: xworkSample -->

notice:注意每一步每一步对应的大小写

配置文件的节点介绍:
package元素定义 struts2请求处理的逻辑单元  
    name 属性必须唯一(指定包的名称,可用于被其它包引用)
    extends 属性用于指定继承哪个包
    namespace用来指定命名空间,从而逻辑上不同命名空间下可以出现同名的Action

action元素 用于配置具体工作的Action类
    name 属性是action的名字
    class 用于设定Action处理的全限定名类

result用来设定Action处理后,系统下一步将要做什么
    name 属性是逻辑视图名称,必须和action 类返回值匹配
    result节点的值则是对应结果的视图位置

实际上更多的会用javabean(实体对象)来保存信息
这时action 和jsp中就变成了这样

action:
public class LoginAction implements Action{
    private User user;

    public String execute() throws Exception {
        //...
    }
    ...
    //getter setter...
}

jsp:
<input type="text" name="user.name" />
<input type="password" name="user.password" />

struts2实际上会调用LoginAction.getUser().setName()
原本action代码中并没有实例化bean对象,应该报错的,但在struts中会自动实例化任何用于填充数据的对象

struts2 访问servlet api
与servlet api解耦的访问方式:
使用ActionContext类获取Servlet API对象对应的Map对象,在Action类中,我们可以直接访问 HttpServletRequest HttpSession 和 ServeletContext对应的Map对象
通过struts框架内的com.opensymphony.xwork2.ActionContext 类获取, ActionContext是Action执行的上下文,在ActionContext中保存了Action类执行时所需要的一组对象
获取方法:

ActionContext ac = ActionContext.getContext();

//获取 HttpServletRequest
Map request = (Map)ac.get("request");

//获取 HttpSession
Map session = ac.getSession();

//获取 ServletContext
Map application = ac.getApplication();

实例:

jsp:
<h3>欢迎您,${sessionScope.CURRENT_USER}!</h3>

<div class="row">
    <form action="Login.action" method="post">
        <input name="user.name" type="text" placeholder="用户名" />
        <input name="user.pass" type="password" placeholder="密码" />
        <br/>
        <input type="submit" value="提交" />
    </form>
</div>

Action:
public class LoginAction implements Action{
    private String message = "";
    private User user;
    public String execute() throws Exception {
        this.setMessage("hello,"+this.user.getName()+"! pass: "+this.user.getPass());
        ActionContext ac = ActionContext.getContext();
        Map<String,Object> session = ac.getSession();
        if("lili".equals(this.user.getName()) && "dd".equals(this.user.getPass()) ){
            session.put("CURRENT_USER", this.user.getName());
            return "success";
        }
        else{
            return "error";
        }
    }

    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

}

bean:
public class User {
    private String name = "";
    private String pass= "";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getPass() {
        return pass;
    }
    public void setPass(String pass) {
        this.pass = pass;
    }
}

struts.xml内的action配置:
<action name="Login" class="com.bud.test.LoginAction">
    <result name="success">/test/hello-world.jsp</result>
    <result name="error">/index.jsp</result>
</action>

与servlet api耦合的访问方式:
要直接获取servlet api对象可以使用 org.apache.struts2.ServletActionContext类,
它是ActionContext的子类,在这个类中定义了如下方法获取servlet api对象

public static HttpServletRequest getRequest() : 得到HttpServletRequest对象
public static ServletContext getServletContext() : 得到ServletContext对象
public static HttpServletReponse getResponse() :   得到HttpServletResponse对象

notice:
   ServletActionContext对象并没有定义直接获取HttpSession对象的方法,但你可以通过HttpServletRequest来得到

此外还可通过Action类实现特定的接口,由struts2向Action实例注入Servlet api对象

org.apache.struts2.util.ServletContextAware 将向Action实例注入ServletContext对象,该接口只有一个方法
 void setServletContext(ServletContext context)

org.apache.struts2.interceptor.ServletRequestAware : 同上接口只有一个方法
 void setServletRequest(HttpServletRequest request)

org.apache.struts2.interceptor.ServletReponseAware : 同上接口只有一个方法
 void setServletResponse(HttpServletResponse reponse)

后续待补充...

时间: 2024-10-29 19:05:44

java的struts2整理的相关文章

这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理。

这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理.        01-java高级架构师设计-基础深入        J2SE深入讲解        Java多线程与并发库高级应用视频教程下载        java反射机制        java设计模式视频        数据结构视频教程        Eclipse视频教程.zip        MyEclipse视频教程.zip    02-java高级架构师设计-JavaEE拓展        A

java密码学学习整理--对称加密(着重描述3des)

1.对称加密要点 对称加密算法的核心是加密和解密操作使用同一套密钥.加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要.因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题. 2.des(参考自:http://baike.baidu.com/view/878529.htm?from_id=210508&type=syn&fromtitle=DES&fr=aladdin) DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位(每组的

JAVA基础知识整理

一.首先先明白get与post的基本定义和区别: 这是两种在客户端和服务器端进行请求-响应的方法. 1get:从指定的资源请求数据. 2post:向指定的资源提交要处理的数据. get基本上用于从服务器取回数据,注意:get方法可能返回缓存数据. post可以从服务器上获取数据,不过,post方法不会缓存数据,并且常用语连同请求一起发送数据. 二. Jquery $.get()方法. $.get()方法通过Http Get发起请求,从服务器上请求数据. 语法:&.get(URL,callback

java 守护线程整理

java中finally语句不走的可能存在system.exit(0)与守护线程 线程sleep采用TimeUnit类 设定线程的名字thread.getcurrentThread().setName() 设定守护线程thread.getcurrentThread().setDaemon(true) http://www.cnblogs.com/diyingyun/archive/2011/12/04/2275268.html 守护线程在没有用户线程可服务时自动离开,在 Java中比较特殊的线程

【Java基础】Java面试题目整理与解说(二)

1.Collection 和 Collections 的差别. Collection 是集合类的上级接口,继承于他的接口主要有 Set 和 List. Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索.排序.线程安全化等操作. 2.HashMap 和 Hashtable 的差别. HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完毕了 Map 接口,HashMap是非线程安全,效率上可能高于 Hashtable.在多个线程

java访问权限整理

类实例化成对象之后,可以通过对象加上"."操作符访问和操纵该对象的域和方法,但是这种访问是有限制的,通过public.protected.default(啥都不写).private来控制. 先看一个实验的例子:(不注释表示可以访问,注释掉表示无法访问) package packageA; import packageB.SubB; public class Base { public String publicStr = "publicString"; protec

java开发struts2项目遇到FilterDispatcher过时

由于工作需要,再次需要写一些简单的Java代码了,曾经的Java编程历历在目,但是却再也找不到以前的感觉了.于是便怀着对儿时Java的记忆,再次踏上Java Web Project. 在此特别鸣谢:http://miaoxianjie.iteye.com/blog/1156831作者,是您让我找回了对Java仅剩的那一点点肤浅,接下来,我们入正题吧. struts与Java web的搭建步骤就参照上面的博文就可以了 项目搭建OK,运行    http://localhost:8080/Porta

Java 多线程知识点整理

1.如何停止一个正在运行的线程? 使用共享变量,用volatile变量修饰,线程循环去访问该变量.如果线程因为发生某些事件进行阻塞,可以使用Thread的interrupt方法.可以使一个被阻塞的线程抛出一个中断异常,从而使线程提前结束阻塞状态,退出堵塞代码. class MyThread extends Thread { volatile boolean stop = false; public void run() { while (!stop) { System.out.println(g

Java注释规范整理

在软件开发的过程中总是强调注释的规范,但是没有一个具体的标准进行说明,通常都是在代码编写规范中简单的描述几句,不能作为一个代码注释检查的标准和依据,做什么都要有一个依据吗:),现在我特整理了一个<Java的注释规范>,内容来自网络.书籍和自己的实际积累. JAVA注释规范 版本/状态 作者 版本日期 1.0 ghc 2008-07-02 一.背景 1.当我们第一次接触某段代码,但又被要求在极短的时间内有效地分析这段代码,我们需要什么样的注释信息? 2.怎么样避免我们的注释冗长而且凌乱不堪呢?