- 浏览: 2652230 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
这一节,我们要掌握的东西
webwork操作session
webwork的验证
webwork两种驱动方式:
- Property-Driven
- Model-Driven
前面我们已经学会了webwork的第一个例子,我们发现webwork中的Action是完全和Sevlet解耦合的,在web开发中,我们很多时候都要对Session,Application,Parameter进行操作,那么在webwork中我们该怎么做呢?
我们可以通过两种方式对它们进行操作,一种是通过com.opensymphony.xwork.ActionContext进行操作,另外一种是通过实现com.opensymphony.webwork.interceptor.SessionAware接口,这一节我们只关注第一种方式
参考webwork的API,ActionContext是一个执行中的Action的上下文(Context),里面存放了Action,Session,Application,Parameter等信息,通过ActionContext我们就可以很方便的实现上述我们想要的功能啦!那么你可能会问ActionContext又是如何得到这些信息的呢?还记得上个教程中配置文件web.xml里的过滤器(filter)吗? 当一个浏览器产生一个请求到达webwork的时候,首先是被过滤器获得,过滤器通过询问com.opensymphony.webwork.dispatcher.mapper.ActionMapper接口,是否要响应这次请求(实际上就是看我们的配置文件里面是不是有这个action 名字),如果是,过滤器就负责把Session,Parameter,ServletContext等信息转化成一个map对象
然后在通过com.opensymphony.xwork.ActionProxyFactory 的createActionProxy(String namespace,String actionName, Map extraContext,boolean executeResult,boolean cleanupContext)创建ActinoProxy,注意它的参数,第一个是Action的名字空间,第一个是Action的名字,第三个map这里面就是包含的就是上面的信息了.通过ActionProxy,就已经解耦合了面向Servlet的webwork和xwork拉!
在ActionProxy通过一系列的方法之后会创建com.opensymphony.xwork.ActionInvocation接口,这个接口表示的是一次Action执行的状态,ActionContext实际上就是在这个接口的实现类DefaultActionInvocation被初始化的, 查看API,可以看到ActionInvocation有一个getInvocationContext()的方法,所以ActionContext就是这样来的
理论说了这么多,还是来点实际的吧:
类:
Domain Object: User
Action :SimpleAction
页面:
index.jsp
success.jsp
先看index.jsp
- <%@taglib prefix="ww" uri="/webwork" %>
- <html>
- <body>
- <form action="simple.action">
- <input type="text" name="user.username"><br>
- <input type="password" name="user.password"><br>
- <input type="submit" value="submit">
- </form>
- </body>
- </html>
和第一个教程是一样的,我就不再重复
User:
- package mypackage;
- import java.util.ArrayList;
- import java.util.List;
- public class User {
- String username;
- String password;
- List message = new ArrayList();
- public List getMessage() {
- return message;
- }
- public void setMessage(List message) {
- this.message = message;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- }
SimpleAction:
- package mypackage;
- import java.util.Map;
- import com.opensymphony.xwork.Action;
- import com.opensymphony.xwork.ActionContext;
- public class SimpleAction implements Action {
- private User user = new User();
- public String execute() throws Exception {
- System.out.println(Thread.currentThread().getName());
- ActionContext context = ActionContext.getContext();
- Map session = context.getSession();
- session.put("user", user);
- user.getMessage().add("msg1");
- user.getMessage().add("msg2");
- user.getMessage().add("msg3");
- return SUCCESS;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- }
其实代码比较简单
ActionContext通过静态方法返回自身的实例,然后可以看到context有很多方法,包括getApplication(),getSession(),getParameter(),它们返回的都是map.然后分别对这个map进行操作就可以拉
你可能会觉的奇怪,ActionContext通过一个简单的map如何区分两个不同的会话(Session)呢?
答案在于ActionContext是一个线程本地变量(thread local),webwork对于每一个不同的线程,都会把ActionContext放在他们的ThreadLocal中,而我们底层(Tomcat服务器,也是Servlet规范)对于每一个浏览器请求都会产生一个唯一的线程,这样一个线程对应一个浏览器会话,同时也对应了一个ActionContext.
我们可以给一个简单的Servlet 例子来帮助理解:
- package mypackage;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class ThreadLocalServlet extends HttpServlet {
- public void service(HttpServletRequest request,HttpServletResponse response) throws IOException{
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out.println(Thread.currentThread().getName()); //得到当前线程的名字
- }
- }
以下三个不同的浏览器窗口访问这个Servlet的一种结果:
http-8080-Processor24
http-8080-Processor25
http-8080-Processor26
webwork会通过三个不同的线程(同时对应了三个不同的浏览器窗口)产生三个不同的ActionContext实例 ,这样就起到了回话的作用了
好了,这个问题搞清楚之后,继续前面的的Action,
来看Action的配置文件xwork.xml
- <!---->>
- <xwork>
- <include file="webwork-default.xml" />
- <package name="default" extends="webwork-default">
- <action name="simple" class="mypackage.SimpleAction">
- <result name="success" type="redirect">success.jspresult>
- <interceptor-ref name="params" />
- action>
- package>
- xwork>
这个配置文件和上篇文件的配置文件是一样的
1.把默认webwork-default.xml包含在我们的配置文件里,webwork-default.xml放在webwork.jar文件中,里面定义了拦截器(inteceptor),和返回(result),这里是一个代码片段
- <!---->>
- <xwork>
- <package name="webwork-default">
- <result-types>
- ......
- <result-type name="dispatcher" class="com.opensymphony.webwork.dispatcher.ServletDispatcherResult" default="true"/>
- <result-type name="redirect" class="com.opensymphony.webwork.dispatcher.ServletRedirectResult"/>
- result-types>
- <interceptors>
- ......
- <interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/>
- ......
- interceptors>
- <package name="webwork-default">
- xwork>
2.定义一个package,相当于java里面的的package关键字,起到一个命名空间的作用
3.在pakcage里面定义action,一个package里面可以定义多个action,这里主义的是name 要和 index.jsp 表单中action的名字相同。
4.在action中定义result,默认的返回方式(type)是dispater,我们把它改为重定向redirect
5.定义我们引用的 拦截器params
最后来看我们的success.jsp
- <%@taglib prefix="ww" uri="/webwork"%>
- <html>
- <body>
- <ww:property value="#session.user.username"/>
- <ww:property value="#session['user'].password"/>
- <ww:iterator value="#session.user.message">
- <div style="color: red"><ww:property/>div>
- ww:iterator>
- body>
- html>
1.声明了我们要使用的webwork标签库
2.通过
- <ww:property value=""/>
的形式,得到我们想要获取的值,
访问session可以通过两种方式
- #session.user.username
- #session['user'].password
我个人觉得第一种更简单一些。注意这样访问
- #session['user.password']
是得不到正确值的.
3.以下代码
- <ww:iterator value="#session.user.message">
- <div style="color: red"><ww:property/></div>
- </ww:iterator>
声明了一个迭代器标签它,它可以方便的取出一个容器里面的值,
ok,通过webwrok操作session就此结束,希望这篇文章能对您有所帮助,
还有很多的朋友在讲解webwork2,他们的教程比我写的更好
http://webwork.javascud.org/
评论
可能是xwork不会配置 能给你一个全的嘛?
1、经典的MVC,前端控制器(Struts,Webwork)
2、基于组件,事件驱动(JSF,Tapestry)
3、基于模板(FreeMaker,Velocity)
具体采用那种就是仁者见仁,智者见智的事情啦
struts/webwork是请求驱动的开发模式,因为它是开放源代码的,开发简单,快捷,并且使用它能让你更好的理解MVC模式,受到广大程序员的喜爱。
在项目中采用什么开发方式并不是由某项技术决定,而是由具体的项目决定的,但我还是认为在企业开发中采用struts的比JSF多
发表评论
-
JFace Text Editor完全掌握之终极指南(4)
2009-09-01 18:15 0错误标识(Error Marking) Error Marki ... -
clipse
2009-09-01 15:19 0JFace Text Editor是JFace里面一个功能强大 ... -
webwork2入门(二.2)
2007-03-22 11:41 3143在web应用经常需要要对用户提交的表单进行验证 webwork ... -
webwork2入门(一)
2007-03-15 15:53 2411本文采用一个用户注册的例子,起到一个最简单的webwok2 ... -
webwork2的测试
2007-03-15 14:26 3297webwork2分为webwork和xwork,通过webwo ...
相关推荐
WebWork入门与精通 WebWork是一个开源项目,由OpenSymphony组织开发,项目创始人是Rickard Oberg。WebWork是一个基于Java的Web应用程序框架,提供了一个灵活的架构,可以帮助开发者快速构建Web应用程序。 WebWork...
1. `WEB-INF`目录:这是Web应用的标准目录,其中包含`web.xml`配置文件,这是Web应用的部署描述符,用于配置WebWork2的过滤器和Servlet。 2. `actions`目录:存放自定义的Action类,如`HelloWorldAction.java`,这是...
2. **WebWork入门** - **框架起源**:WebWork是Struts2的前身,它的许多理念和设计被Struts2采纳。WebWork引入了拦截器、类型转换、数据绑定等概念,显著提升了开发效率。 - **Action与ActionForm**:在WebWork中...
本篇将围绕"WebWork入门学习"这一主题,深入讲解WebWork的核心概念、基本架构以及如何使用WebWork进行Web项目开发。 一、WebWork简介 WebWork由Apache软件基金会维护,其设计理念是通过减少样板代码和提供强大的...
快速入门章节为初学者提供了快速上手Webwork2的方法。首先,你需要下载WebWork2的最新版本,并将发行包中的`webwork-2.1.1.jar`及`lib\core\*.jar`文件复制到Web应用的`WEB-INF\lib`目录下。这一步骤确保了Web应用...
二、WebWork2快速入门 1. 安装配置:首先,需要在项目中引入WebWork2的依赖库,配置web.xml文件以启动WebWork2的Servlet。然后,创建一个基本的动作类,并在actions.xml文件中进行映射。 2. 创建第一个动作:创建...
WebWork 是一个基于Java的MVC(模型-视图-控制器)框架,它在Web应用程序开发中被广泛使用。WebWork 2.1是该框架的一个版本,...开发者可以通过这个压缩包快速入门,理解WebWork的工作原理,并运用到实际的项目开发中。
《WebWork入门到精通》这一课程由松迪科技(北京)有限公司的田雪松主讲,旨在全面解析WebWork框架,从基础知识到高级应用,帮助学员掌握WebWork的核心技术和实战技巧。 ### WebWork概述 WebWork是一个开源的MVC...
这个"WebWork入门教程[创建你第一个WebWork action]"将引导你了解如何利用WebWork来构建动态的Web应用程序。让我们深入探讨WebWork的核心概念、Action的创建以及如何实现基本的流程控制。 **WebWork核心概念** 1. ...
1. 入门指南:介绍如何安装和配置WebWork,以及创建第一个WebWork应用。 2. 深入理解:讲解Action、Interceptor、OGNL等核心组件的工作原理。 3. 实战示例:通过实际项目案例展示WebWork的应用场景和最佳实践。 4...
这个“WebWork入门例子 HelloWorld”是为初学者准备的一个简单教程,旨在帮助他们快速理解WebWork框架的基本概念和工作原理。 WebWork的核心特性包括动作映射、数据绑定、拦截器、异常处理和强大的视图渲染。它通过...
**WebWork 2.2 入门指南** WebWork 是一款基于 Java 的开源 Web 应用框架,它在 MVC(模型-视图-控制器)架构上构建,为开发者提供了强大的功能,包括动作映射、数据绑定、异常处理等。本文将深入浅出地介绍如何...
### WebWork2 教程详解 #### 一、引言 WebWork2 是一款轻量级的 Java Web 开发框架,它遵循 MVC (Model-View-Controller) 设计模式,旨在...希望本教程能帮助您快速入门 WebWork2,并在实际项目中灵活运用这些知识。
以上是WebWork入门的基本内容,涵盖了WebWork的核心概念、安装、动作、ActionContext以及请求处理机制。继续深入学习,你可以探索更多高级特性,如拦截器(Interceptor)、国际化(i18n)、AOP(面向切面编程)等,...
### WebWork快速入门知识点 #### 一、WebWork框架简介 **WebWork**是一个由OpenSymphony组织开发的Java Web应用框架,它采用MVC(Model-View-Controller)架构模式,强调组件化和代码重用。WebWork的最新版本为2.1...