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)

后续待补充...

java的struts2整理的更多相关文章

  1. Java 学习资料整理

    Java 学习资料整理 Java 精品学习视频教程下载汇总 Java视频教程 孙鑫Java无难事 (全12CD) Java视频教程 即学即会java 上海交大 Java初级编程基础 共25讲下载 av ...

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

    这是一套Java菜鸟到大牛的学习路线之高级教程,由工作了10年的资深Java架构师整理.        01-java高级架构师设计-基础深入        J2SE深入讲解        Java多 ...

  3. Java基础进阶整理

    Java学习笔记整理 本文档是我个人整理的,首先是想通过完成本文档更加扎实自己的基础加强对java语言的理解,然后就是想给入了门的同志们做下贡献. 当然,本文档主要是对java语言基础(当然还有很多基 ...

  4. 尚学堂Java面试题整理

    博客分类: 经典分享   1. super()与this()的差别? - 6 -  2. 作用域public,protected,private,以及不写时的差别? - 6 -  3. 编程输出例如以 ...

  5. Java学习资源整理(超级全面)

    这里整理一些自己平常搜集的比较好的关于Java的学习资源,主要包括博客站点.书籍.课程等. 了解Java最新资讯 这部分主要是了解与Java相关的动态以及信息,能够拓展我们的视野以及寻找一些好的ide ...

  6. 【JAVA面试】java面试题整理(4)

    版权声明:转载请注明 https://blog.csdn.net/qq_33591903/article/details/83473779                               ...

  7. 北京Java笔试题整理

    北京Java笔试题整理 1.什么是java虚拟机?为什么ava被称作是"平台无关的编程语言? 答:Java虚拟机可以理解为一个特殊的"操作系统",只是它连接的不是硬件,而 ...

  8. 微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决

    微信企业号回调模式配置解说 Java Servlet+Struts2版本号 echostr校验失败解决 echostr校验失败,请您检查是否正确解密并输出明文echostr 异常java.securi ...

  9. Java-最常用的Java日志框架整理

    Java-最常用的Java日志框架整理 前言 Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日 ...

随机推荐

  1. TP5 行为Behavior用法说明

    TP5 行为Behavior用法说明 无论是tp3还是在tp5中,行为都是一个非常重要的概念,关于太多的理论知识,就不多说了,不了解的请查看开发文档:TP5 行为概述 以下,就由代码来一步一步实现行为 ...

  2. U盘装机记录

    U盘装机记录 1. 将U盘制作为启动盘(安装PE文件到U盘). (1)准备材料 8G以上U盘一个 一个可信的启动盘制作工具(这里是用的老毛桃) (2)将U盘插入电脑,单击老毛桃客户端(出现如下图所示的 ...

  3. 小白对异步IO的理解

    前言 看到越来越多的大佬都在使用python的异步IO,协程等概念来实现高效的IO处理过程,可是我对这些概念还不太懂,就学习了一下. 因为是初学者,在理解上有很多不到位的地方,如果有错误,还希望能够有 ...

  4. contextmanager 的基本使用

    from contextlib import contextmanager 简化 With 语句: class MyResource:    def query(self):        print ...

  5. NumPy库入门

    ndarray数组的元素类型 ndarray数组的创建 ndarray数组的操作 ndarray数组的运算

  6. Servlet过滤器---编码转换过滤器

    该实例用于将请求与相应的编码设置为当前网站的默认编码 java类: import java.io.IOException; import javax.servlet.Filter; import ja ...

  7. P2580 于是他错误的点名开始了(trie)

    P2580 于是他错误的点名开始了 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉 ...

  8. Win Server 8中的利器:微软在线备份服务

    微软在Windows Server 8中添加在线备份服务了?你一定以为我在开玩笑,是吧?但是微软确实这么做了.     微软在Windows Server 8中添加在线备份服务了?你一定以为我在开玩笑 ...

  9. 《Cracking the Coding Interview》——第8章:面向对象设计——题目1

    2014-04-23 17:32 题目:请设计一个数据结构来模拟一副牌,你要如何用这副牌玩21点呢? 解法:说实话,扑克牌的花样在于各种花色.顺子.连对.三带一.炸弹等等,如果能设计一个数据结构,让判 ...

  10. 安卓Dex壳技术探讨(1)

    最近在研究安卓平台的加壳技术,以前以为只有原生层的代码才可以加壳,看了看网上的资料,才发现原来Java层也可以加壳,虽然与传统的壳有些区别,但就最终的效果来说,反静态分析的目的还是达到了的. 目前安卓 ...