- 浏览: 477369 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
excellent95:
谢楼主分享,确实是CSS图片问题
Struts2判断页面是POST方式提交还是GET方式提交 -
wangluo2:
javaBase那个包显示有问题啊pom文件那一行报错了
微信公众平台开发实战(08) 基于地理信息的服务(LBS) -
andilyliao:
jd技术这么渣也好意思出书,真是醉了
《京东技术解密》试读--十年磨一剑 -
bitray:
刘强东作序多什么,他也不会什么技术,腾讯出来帮他还不是因为腾讯 ...
《京东技术解密》试读--十年磨一剑 -
come_for_dream:
想试试搞这个
《大型分布式网站架构设计与实践》试读
1、使用领域对象来接收用户输入
【工程1:sx_ch0301】:
User对象中包含两个字段:username和password,在Action中有一个User对象user,则在jsp中:
<input type="text" name="user.username"> <input type="password" name="user.password">
来进行数据绑定。
当Struts2尝试设置user对象的username属性时,将依次调用以下的方法:
action.getUser(); action.setUser(new User()); action.getUser().setUserName();
Struts2首先尝试获得User对象的引用,当它发现User对象为null时,它将使用User类的默认构造方法创建一个User实例,并调用action的setUser()方法设置这个实例。这样,Struts2就可以设置Usser对象的username字段了。
在Struts2中,自动实例化对象的特性对于任意层次的对象包含关系都是适用的。
例如, user.address.street这样的表达式会调用:
getUser().getAdderss().setStreet(...);
Struts2会先创建User对象,接着创建Address对象,然后设置Address对象的street属性。
2、使用ModelDriver action
【工程2:sx_ch0302】:
LoginAction 类实现了 ModelDriven 接口:(注意要实例化 User 对象,否则在 getModel() 时会取不到对象。)
public class LoginAction implements Action, ModelDriven<User> { private User user = new User(); @Override public User getModel() { return user; } }
在login.jsp页面中,表单字段就不需要再使用“user.”前缀了:
<input type="text" name="username"> <input type="password" name="password">
在sucess.jsp页面中,表单字段也不需要再使用“user.”前缀了:
<s:property value="username" />
3、使用action的属性接收用户输入
【工程3:sx_ch0303】:
在 Struts2 中,可以直接使用 action 的属性来接收用户的输入。为LoginAction添加 username 和 password 属性,同时实现这两个属性的getter和setter方法(这样可以直接删除 User 类 ):
public class LoginAction implements Action { private String username; private String password; public String execute() throws Exception { // 这里直接和属性比对 if ("zhangsan".equals(username) && "1234".equals(password)) { return SUCCESS; } else { return ERROR; } } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
4、访问request、session和application对象
4.1 与 Servlet API 解耦的访问方式
【工程4:sx_ch0304】:
// 获得action的执行上下文 ActionContext context = ActionContext.getContext(); // 得到三个对象 Map request = (Map)context.get("request"); Map session = context.getSession(); Map application = context.getApplication(); // 使用三个对象 // 在请求中放置欢迎信息 request.put("greeting", "欢迎光临"); // 在Session中保存 User 对象 session.put("user", user); // 统计用户访问量,在 application 中保存用户访问量数据 Integer count = (Integer) application.get("counter"); if (null == count) { count = 1; } else { count++; } application.put("counter", count);
使用JSP内置的表达式语言来访问request、session和application范围的数据:
${seesionScope.user.username},${requestScope.greeting} ${applicationScope.counter}
【工程5:sx_ch0305】:
利用请求对象来传递数据还有一种方式,直接使用 ActionContext 类的put()方法将数据保存到 ActionContext 中:
ActionContext.getContext().put("greeting", "欢迎光临");
然后在页面中,从请求对象中取出 greeting 属性:
${requestScope.greeting}
或者:
<%=request.getAttribute("greeting")%>
【工程6:sx_ch0306】:
通过接口注入来获取request、session和application对象,
- request:实现 RequestAware 接口,实现setRequset(Map request)方法
- session:实现 SessionAware 接口,实现setSession(Map session)方法
- application:实现 ApplicationAware 接口,实现setApplication(Map application)方法
public class LoginAction implements Action, RequestAware, SessionAware, ApplicationAware { private User user = new User(); private Map request; private Map session; private Map application; public void setRequest(Map request) { this.request = request; } public void setSession(Map session) { this.session = session; } public void setApplication(Map application) { this.application = application; } @SuppressWarnings("unchecked") public String execute() throws Exception { if ("zhangsan".equals(user.getUsername()) && "1234".equals(user.getPassword())) { // 在请求中放置欢迎信息 request.put("greeting", "欢迎光临"); // 在Session中保存 User 对象 session.put("user", user); // 统计用户访问量,在 application 中保存用户访问量数据 Integer count = (Integer) application.get("counter"); if (null == count) { count = 1; } else { count++; } application.put("counter", count); return SUCCESS; } else { return ERROR; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
4.2 与 Servlet API 耦合的访问方式
【工程7:sx_ch0307】:
通过ServletActionContext 类来获取HttpServletRequest和ServletContext对象
- HttpServletRequest:public static HttpServletRequest getRequest()
- ServletContext:public static ServletContext getServletContext()
注:ServletActionContext 类并没有提供直接得到 HttpSession 对象的方法,此对象可通过 HttpServletRequest 对象的 getSession() 方法来得到。
import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.coderdream.model.User; import com.opensymphony.xwork2.Action; public class LoginAction implements Action { private User user = new User(); @SuppressWarnings("unchecked") public String execute() throws Exception { if ("zhangsan".equals(user.getUsername()) && "1234".equals(user.getPassword())) { HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = request.getSession(); ServletContext context = ServletActionContext.getServletContext(); // 在请求中放置欢迎信息 request.setAttribute("greeting", "欢迎光临"); // 在Session中保存 User 对象 session.setAttribute("user", user); // 统计用户访问量,在 application 中保存用户访问量数据 Integer count = (Integer) context.getAttribute("counter"); if (null == count) { count = 1; } else { count++; } context.setAttribute("counter", count); return SUCCESS; } else { return ERROR; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
【工程8:sx_ch0308】:
还可以通过 ActionContext 类的 get() 方法,传递 ServletActionContext.HTTP_REQUEST 和 ServletActionContext.SERVLET_CONTEXT 键值来获取HttpServletRequest和ServletContext对象,同样,通过 ServletActionContext.HTTP_RESPONSE 键值来得到 HttpServletResponse 对象
import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import com.coderdream.model.User; import com.opensymphony.xwork2.Action; import com.opensymphony.xwork2.ActionContext; public class LoginAction implements Action { private User user = new User(); @SuppressWarnings("unchecked") public String execute() throws Exception { if ("zhangsan".equals(user.getUsername()) && "1234".equals(user.getPassword())) { ActionContext ctx = ActionContext.getContext(); // 通过键值获得对象 HttpServletRequest request = (HttpServletRequest) ctx .get(ServletActionContext.HTTP_REQUEST); HttpSession session = request.getSession(); ServletContext context = (ServletContext) ctx .get(ServletActionContext.SERVLET_CONTEXT); // 在请求中放置欢迎信息 request.setAttribute("greeting", "欢迎光临"); // 在Session中保存 User 对象 session.setAttribute("user", user); // 统计用户访问量,在 application 中保存用户访问量数据 Integer count = (Integer) context.getAttribute("counter"); if (null == count) { count = 1; } else { count++; } context.setAttribute("counter", count); return SUCCESS; } else { return ERROR; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } }
【工程9:sx_ch0309】:
最后,还可以通过 Action 类实现 ServletRequestAware 和 ServletContextAware 接口,由 Struts2 框架向 Action 实例注入 HttpServletRequest 和 ServletContext 对象:
import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.util.ServletContextAware; import com.coderdream.model.User; import com.opensymphony.xwork2.Action; public class LoginAction implements Action, ServletRequestAware, ServletContextAware { private User user = new User(); private HttpServletRequest request; private ServletContext context; @SuppressWarnings("unchecked") public String execute() throws Exception { if ("zhangsan".equals(user.getUsername()) && "1234".equals(user.getPassword())) { HttpSession session = request.getSession(); // 在请求中放置欢迎信息 request.setAttribute("greeting", "欢迎光临"); // 在Session中保存 User 对象 session.setAttribute("user", user); // 统计用户访问量,在 application 中保存用户访问量数据 Integer count = (Integer) context.getAttribute("counter"); if (null == count) { count = 1; } else { count++; } context.setAttribute("counter", count); return SUCCESS; } else { return ERROR; } } public User getUser() { return user; } public void setUser(User user) { this.user = user; } public void setServletRequest(HttpServletRequest request) { this.request = request; } public void setServletContext(ServletContext context) { this.context = context; } }
输出结果:
评论
已经更正,谢谢!
这个只是学习笔记!
孙鑫的书是不错,不过有个大错误。
就是第457页,关于radio中使用freemarker的hash的内容,是错误的。
我试验了,不行,下文是正解!
http://www.iteye.com/topic/281493
你试试这种写法#@java.util.HashMap@{'MAN':'男','WOMEN':'女'},应该可以解决问题,不必要改代码
你的代码太丑了,如果是直接用OGNL,根本没必要那样写。
这样写即可:
http://netfork.iteye.com/blog/240868
r'#{"true":"男", "false":"女"}'
建议把下面的文章看全了,再来思考我为什么要改struts2的代码。
http://www.iteye.com/topic/281493
孙鑫的书是不错,不过有个大错误。
就是第457页,关于radio中使用freemarker的hash的内容,是错误的。
我试验了,不行,下文是正解!
http://www.iteye.com/topic/281493
你试试这种写法#@java.util.HashMap@{'MAN':'男','WOMEN':'女'},应该可以解决问题,不必要改代码
大哥,发这个文有什么用啊?孙鑫的书是不错,不过有个大错误。就是第457页,关于radio中使用freemarker的hash的内容,是错误的。我试验了,不行,下文是正解!http://www.iteye.com/topic/281493
学习笔记,很多东西对用过Struts1的人来说都是新东西,所以记录一下。
孙鑫的书是不错,不过有个大错误。
就是第457页,关于radio中使用freemarker的hash的内容,是错误的。
我试验了,不行,下文是正解!
http://www.iteye.com/topic/281493
发表评论
-
Maven Struts2 项目
2013-09-14 11:44 01、创建好Maven环境; 2、创建一个Maven工 ... -
【张冰Struts2学习笔记】0601.struts.xml配置详解之六 Action配置3 通配符
2010-11-26 15:19 2587struts.xml 配置详解之六 通配符 ... -
【张冰Struts2学习笔记】0502.struts.xml配置详解之五 Action配置2
2010-11-26 14:28 1931struts.xml 配置详解之五 Action ... -
【张冰Struts2学习笔记】0501.struts.xml配置详解之四 Action配置1
2010-11-26 13:10 1917struts.xml 配置详解之四 Action 配置 ... -
【张冰Struts2学习笔记】0403.struts.xml配置详解之三 拦截器配置
2010-11-25 19:03 3357struts.xml 配置详解之三 拦截器配置 ... -
【张冰Struts2学习笔记】0402.struts.xml配置详解之二 名称空间 包含
2010-11-25 18:59 1956struts.xml 配置详解之二 名称空间 包含 ... -
【张冰Struts2学习笔记】0401_struts.xml配置详解之一
2010-11-25 13:56 2355struts.xml 配置详解之一 Bean ... -
【张冰Struts2学习笔记】0302.Struts2的主要配置文件及优先级
2010-11-20 16:33 1712Struts2 的主要配置文件及优先级 ... -
【张冰Struts2学习笔记】0301_struts.properties 配置详解(表格版)
2010-11-17 15:23 1612注:附件pdf中有35个属性! ... -
【张冰Struts2学习笔记】0202_Struts2的三种接收用户输入的方法
2010-11-17 12:32 2092Struts2的三种接收用户输入的方法 ... -
【张冰Struts2学习笔记】0201_Action接口与ActionSupport类
2010-11-16 15:32 4116Action 接口与ActionSupport ... -
【张冰Struts2学习笔记】0102_第一个Struts2实例
2010-11-14 19:17 3030基于Struts2 的简单登录项目 ... -
【张冰Struts2学习笔记】0101_Struts1与Struts2的不同点
2010-11-14 14:12 1425Struts1与Struts2的不同点 ... -
基于Struts2的Web应用程序所需要的最少类库
2010-08-30 16:17 1923Struts 2.0.11版: 文件名 ... -
Struts2判断页面是POST方式提交还是GET方式提交
2010-06-03 11:06 9171在项目开发过程中,发现有个页面会提交两次,一直没有找到原因,后 ... -
Struts2的一个问题!no found ApplicationContextAware
2009-06-15 16:39 1744问题: Caused by: java.lang.NoC ... -
struts2的select用法
2009-02-11 09:59 66891、在页面对应的Action中有typeBase属性,改变下拉 ... -
子页面刷新父窗口
2009-02-09 11:50 3153下面的例子是一个子窗体调用方法改变父窗体 主页面 cc.ht ... -
Struts2结合JavaScript控制单选框的状态
2008-12-26 11:48 2084需求: 某个页面有3种操作,新增、修改和删除,其中某个字段为只 ... -
Struts2使用经验
2008-11-27 14:35 1443、显示某个对象的某个属性值: 两种方式: ${enterpri ...
相关推荐
2. **`struts2-plugin.xml`**:如果使用了第三方插件,该文件中会包含这些插件的配置信息。 3. **`struts.xml`**:应用级别的配置文件,用于配置Action、拦截器栈等。 4. **`struts.properties`**:包含了一些框架级...
### Struts2学习笔记2012 #### 一、建立一个Struts2工程 **步骤详解:** 1. **创建Web项目:** - 在MyEclipse中选择“File” > “New” > “Dynamic Web Project”,创建一个新的Web项目。 2. **解压并配置...
### Struts2_Action 学习笔记与通配符配置详解 #### 一、Struts2简介及简单配置 Struts2是一个基于Java EE平台的开源Web应用框架,它继承了Struts1的优点,并在此基础上进行了大量的改进。Struts2的核心功能之一是...
### Struts2基础知识详解 #### 一、Struts2简介与环境搭建 **Struts2**是Apache组织下的一个开源框架,它继承了Struts1的设计理念,但在很多方面进行了改进,提供了更丰富的功能和更好的灵活性。Struts2基于MVC...
- Struts2有许多官方和第三方插件,如i18n、json、freemarker等,它们的配置在`struts-plugin.xml`中完成。 8. **Action与Service层整合** - Spring管理Service层对象,Struts2通过Spring插件注入Service,实现...
- **lib**:包含了Struts2框架的核心库及第三方插件库。 - **src**:包含了Struts2框架的源代码。 ##### 2.2 必备JAR包 为了在项目中使用Struts2框架,我们需要将一些必要的JAR包加入到项目的类路径中。这些JAR包...
- **第三方JAR**: - `commons-fileupload-1.2.1.jar` - `commons-io-1.3.2.jar` - `commons-logging-1.0.4.jar` - `xwork-2.1.2.jar` - `ognl-2.6.11.jar` - `freemarker-2.3.13.jar` - **配置文件**: `struts...
本资料包包含了关于Struts2的学习笔记和代码示例,旨在帮助初学者或进阶者深入理解并熟练掌握这一框架。 笔记部分可能涵盖以下知识点: 1. **Struts2基础**:介绍Struts2的基本概念,包括Action、Result、...
### Struts2框架详解 #### 一、Struts2框架介绍 Struts2是一个基于MVC模式的开源Java Web框架,它提供了丰富的功能用于构建Web应用程序。与Struts1相比,Struts2的设计思想和架构有着根本的不同。Struts2的核心是...
- **社区支持**:SpringMVC有着更广泛的社区支持和更多的第三方库支持。 - **性能**:SpringMVC在性能上通常优于Struts。 #### 八、总结 SpringMVC是一个强大且灵活的Web开发框架,它简化了Web应用程序的开发过程...
### 黑马Maven笔记第二天知识点总结 #### Maven的核心优势 **1. 统一管理JAR包** - **节省空间**:Maven通过中央仓库管理所有项目的依赖,避免了重复下载相同JAR包的问题,有效减少了硬盘空间的占用。 - **依赖...
### SpringMVC基础知识详解 #### 一、SpringMVC简介 **SpringMVC**是Spring框架中的一个重要组成部分,主要用于Web应用程序的开发。它遵循MVC(Model-View-Controller)设计模式,帮助开发者构建清晰、可维护的Web...
##### 第三阶段:模块设计 - **Struts2**:一种基于MVC模式的Java Web应用框架。 - **Hibernate**:一个面向对象的持久层框架。 - **Spring**:轻量级的Java开发框架,提供依赖注入、面向切面编程等功能。 - **...
### Spring学习笔记知识点详解 #### 一、Spring框架概述 **Spring** 是一个开源的、分层的企业级应用开发框架,旨在简化Java EE应用程序的开发。它的主要目标是提高开发效率,减少耦合度,并提供一种更为简洁的...
### J2EE核心技术笔记——深入理解分页机制与Struts框架 #### 分页显示机制详解 在J2EE开发中,处理大量数据时,分页显示成为了一个关键的技术点,尤其是当数据集非常庞大时,如2300条记录而非仅仅23条。分页不仅...
#### 第三课:模拟 Spring 功能 - **核心概念**: - **IoC(Inversion of Control)控制反转**:将对象创建的控制权交给框架,对象之间的依赖关系由框架负责管理。 - **DI(Dependency Injection)依赖注入**:...
### WebWork学习笔记知识点 #### 一、WebWork框架简介 - **定义**: WebWork是一个由OpenSymphony组织开发的MVC(Model-View-Controller)框架,专注于组件化和代码重用,适用于J2EE应用程序... - 第三方文章和博客。