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. python__基础 : 类的 __slots__ 方法

    实例在创建出来之后,可以动态的添加属性和方法, 那如果想要限制添加的实例属性,可以用一下 __slots__ 这个东西: class Test(object): __slots__ = ('name' ...

  2. PHP 基础知识总结

    PHP 代表 PHP: Hypertext Preprocessor PHP 文件可包含文本.HTML.JavaScript代码和 PHP 代码 PHP 代码在服务器上执行,结果以纯 HTML 形式返 ...

  3. Java实现系统目录实时监听更新。

    SDK1.7新增的nio WatchService能完美解决这个问题.美中不足是如果部署在window系统下会出现莫名其妙的文件夹占用异常导致子目录监听失效,linux下则完美运行.这个问题着实让人头 ...

  4. [原]sencha touch之表单二(注册页面)

    接着上一篇的登陆页面,来一个最简单的注册页面,几乎包含了常用的field Ext.application({ id:'itKingApp', launch:function(){ var formPa ...

  5. 如何对比两个Jar包

    如果对比两个jar包呢?jar 都是class 文件,我对比jar,就是想知道,它增加了删除了哪些方法.增加了哪些类,删除了哪些类. 有很多方法,你可以,反编译,然后通过beyongCompair 去 ...

  6. getElementByName????????,????????,

    getElementByName可以获取多个元素,获得的是一个数组, getElementById只能获取一个,是dom从上往下的第一个元素.

  7. Eclipse 创建 Java 项目---Eclipse教程第08课

    打开新建 Java 项目向导 通过新建 Java 项目向导可以很容易的创建 Java 项目.打开向导的途径有: 通过点击 "File" 菜单然后选择 New > Java P ...

  8. MySQL添加和删除字段

    查询表的字段类型: mysql> desc t_template_title; +----------------+--------------+------+-----+---------+- ...

  9. Singleton patterns 单件(创建型模式)

    1.模式分类 1.1  从目的来看: •      – 创建型(Creational)模式:负责对象创建. •      – 结构型(Structural)模式:处理类与对象间的组合. •      ...

  10. 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录

     孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...