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. vue学习--Props

    Props:        props用以从父组件接收数据:                     使用:                Vue.component('child',{        ...

  2. win7同时安装python2和python3

    1.下载python2和python3版本. 2.安装python3   1>选择添加PATH路径到系统.   2>为所有用户安装python. 3.安装python2   1>为所 ...

  3. 【PHP】Maximum execution time of 30 seconds exceeded解决办法

    Maximum execution time of 30 seconds exceeded,今天把这个错误的解决方案总结一下: 简单总结一下解决办法: 报错一:内存超限,具体报错语句忘了,简单说一下解 ...

  4. 从0开始学习 Git

    1. 什么是Git? Git 是 Linux 发明者 Linus 开发的一款新时代的版本控制系统,那什么是版本控制系统呢?怎么理解?网上一大堆详细的介绍,但是大多枯燥乏味,对于新手也很难理解,这里我只 ...

  5. #Python编程从入门到实践#第三章笔记

      列表简介 ​​​1.什么是列表 列表:由一系列按也顶顺序排列的元素组成.元素之间可以没有任何关系. 列表:用方括号[]表示,并用逗号分隔其中元素.名称一般为复数 2.访问元素 (1)列表是有序集合 ...

  6. python系列4之装饰器

    目录 递归算法解析 冒泡排序解析 装饰器解析 一. 递归 1. 递归的定义 递归(Recursion),又成为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法.递归一词还较长用于描述以 ...

  7. Small Talk Matters【闲谈很重要】

    Small Talk Matters We' ve all been there: in a lift, in line at the bank or on an airplane, 我们都有过这样的 ...

  8. B1018 锤子剪刀布 (20分)

    B1018 锤子剪刀布 (20分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势. 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. ...

  9. 使用dataframe解决spark TopN问题:分组、排序、取TopN和join相关问题

    package com.profile.mainimport org.apache.spark.sql.expressions.Windowimport org.apache.spark.sql.fu ...

  10. Quartus 11进行编译Compile Design的时候出现错误near text ã

    1. 设计的工程在Compile Design的时候出现以下的错误,百思不得姐 Error (): Verilog HDL syntax error at div_5.v() near text ã ...