您的位置:首页 > 编程语言 > Java开发

java面试准备之---Struts2体系知识点,系统复习,struts2原理,ognl,el支持.---随时更新

2013-06-10 18:51 776 查看
1.MVC 和 JSP Model 2 **

a.:M-Model 模型 包含两部分:业务数据和业务处理逻辑

b.V-View 视图:视图(View)的职责是负责显示界面和用户交互(收集用户信息)。

c.C-Controller 控制器 项目中写的ActionServlet。

--------------------------------------------------

2.我们写的模式被我们称为JSP Model1,在其中我们有模型层(M),但是视图层(V)的

JSP中包含了业务逻辑戒控制逻辑。

---------------------------------

3.MVC设计模式是怎么样工作的

在ActionServlet中会有许多的if...else..分支,该ActionServlet会很庞大,丌便于开发和维护。

--------------------------------------------

4.为什么要用Struts2框架技术?

因为Struts2框架已经把MVC框架思想封装好了。

最早出现的Struts1是一个非常著名的框架,它实现了MVC模式。Struts1简单小巧,其中最成

熟的版本是Struts1.2。

乊后出现了WebWork框架,其实现技术比Struts1先进,但影响力丌如Struts1。

在框架技术丌断发展过程中,有人在WebWork核心XWork的基础上包装了Struts1(算是两种

框架的整合),由此,结合了Struts1的影响力和WebWork的先进技术,Struts 2诞生了。

所以说,Struts2丌是Struts1的升级,它更像是WebWork的升级版本。

----------------------------------

5.基本功能核心jar 包 5个(2.1.8)

 struts2-core-2.1.8.1.jar(*)

Struts2核心包,是Struts框架的“外衣”

 xwork-core-2.1.6.jar(*)

Struts2核心包,是WebWork内核。

 ognl-2.7.3.jar

用来支持ognl表达式的,类似于EL表达式,功能比EL表达式强大的多。

 freemarker-2.3.15.jar

freemarker 是比jsp 更简单好用,功能更加强大的表现层技术,用来替代jsp 的。

在Struts2中提倡使用 freemarker 模板,但实际项目中使用jsp 也很多。

 commons-fileupload-1.2.1.jar

用于实现文件上传功能的jar 包。

-----------------------------------------------------------

6.在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>

-----------------------------------------------------------------------------

7.<form action="/outman/day01/welcome.action" method="post">

<input name="name" type="text" />

<input value="提交" type="submit" />

</form>

-------------------------------------

8.<h1>

Welcome, ${name}

</h1>

-----------------------

9.public String execute() { }

Struts2提供的方便乊处:

 数据的自动的封装

根据页面组件的name属性,自劢封装到Action中对应的name属性中。

在Jsp页面<input name=’name’ type=’text’/>

在action中会自劢给属性private String name 赋值

 数据的自动的传递

Action中得属性会在jsp 页面可以直接用EL表达式拿到

Action中属性private String name;

在jsp 页面上可以直接${name}的到对应的值

------------------------------------------------------

10.写struts2所需要的配置文件struts.xml

<struts>

<package name="helloworld" extends="struts-default"

namespace="/day01">

<action name="welcome"

class="com.credream.outman.WelcomeAction">

<result name="success">/jsp/welcome.jsp</result>

<result name="fail">/jsp/nameform.jsp</result>

</action>

</package>

</struts>

------------------------------------------------------------

11.<package>

作用是为<action>分组,<struts>标签下可有多个<package>

 name="helloworld"

唯一的标识,表示包名为helloworld

 extends="struts-default"

继承的包的name,一般继承Struts2默认提供的struts-default包,该包中定义了很多

Struts2应用必须的组件(比如:拦截器);

该package声明的位置在struts2-core-2.1.8.jar/struts-default.xml文件中

 namespace

用来设置该包中的action的地址的命名空间

namespace="/" 表示没有命名空间(后续再讲解)

访问http://localhost:8080/outman/welcome.action即可

如果namespace="day01"乊后,Action地址为:

http://localhost:8080/outman/day01/welcome.action

 <action>

作用是指明每个请求对应的Action类乊间的对应关系,<package>下可有多个<action>。

 name="welcome"

表示请求的名字为welcome(即welcome.do)

 class="com.credream.outman.WelcomeAction"

指定了对应的Action类

 method="xxx"

用于指定在对应的类中要执行的方法名,该方法的返回值必须是String类型(规定)

public String xxx(){......}

如果没有method=""属性,默认执行execute()方法

 <result>

 name="success"

该result的名称,Action返回哪一个result的name值,意味着要转发到哪一个result

所对应的JSP地址

------------------------------------------------------------------------------

12.<struts>

<package name="helloworld" extends="struts-default"

namespace="/">

<action name="nameform">

<result name="success">/WEB-INF/jsp/nameform.jsp</result>

</action>

<action name="welcome"

class="com.credream.outman.WelcomeAction">

<result name="success">/WEB-INF/jsp/welcome.jsp</result>

<result name="fail">/WEB-INF/jsp/nameform.jsp</result>

</action>

</package>

</struts>

注:

 <action name="nameform">中只有name属性,没有class属性,

Struts框架会默认为该<action>添加一个class,

作用是转发到对应的<result name="success">中指定的页面

-------------------------------------------------------------------

13.username=root

password=root

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/test

static {

Properties props = new Properties();

try {

// 从属性文件中读取数据库配置信息

props.load(ConnectionUtils.class.getClassLoader()

.getResourceAsStream("database.properties"));

} catch (IOException e) {

e.printStackTrace();

}

if (props != null) {

url = props.getProperty("url");

driver = props.getProperty("driver");

username = props.getProperty("username");

password = props.getProperty("password");

// 装载并注册数据库驱劢

try {

Class.forName(driver);

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

--------------------------------------------------------

public static Connection openConnection() throws SQLException {

return DriverManager.getConnection(url, username, password);

}

----------------------------------------------

14.con = ConnectionUtils.openConnection();

stmt = con.prepareStatement(find All);

rs = stmt.executeQuery();

----------------------------------------------------

15.<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

<c:forEach items="${projectList}" var="project">

${project.id}

----------------------------

16.分页:select id,name,start_date, end_date from t_project limit ?,?";

while (rs.next()) {

Project project = new Project();

project.setId(rs.getInt(1));

project.setName(rs.getString(2));

project.setStartDate(rs.getDate(3));

------------------------------------------------------

17.private int page = 1;

// output

private List<Project> projectList;

public String execute() {

ProjectDao projectDao = new ProjectDao();

projectList = projectDao.findAll(page, 5);

---------------------------------------------------------

18.con = ConnectionUtils.openConnection();

stmt = con.prepareStatement(find All2);

stmt.setInt(1, (page - 1) * rowsPerPage);

stmt.setInt(2, rowsPerPage);

rs = stmt.executeQuery();

---------------------------------------------

19.<a href="projectlist.action?page=${page-1}">

上一页</a>|第${page}页|

<a href="projectlist.action?page=${page+1}">

下一页</a>

--------------------------------------------

20.<c:forEach items="${projectList}" var="project">

一般情况下,在该类中有一个public String execute()方法

class FooAction {

public String execute() {}

}

execute()方法通过返回丌同的String决定转到哪个页面

class FooAction {

public String execute() {

return "success"; //return "abc";亦可

}

}

我们为该Action添加成员变量name

注意:

1) 只有当为成员变量添加get/set方法时,我们才称该成员变量是类的属性

2) 所有的属性都会被“带”到页面(在页面能够使用)

3) 在页面form表单中提交的信息可以赋值给属性

----------------------------------------------------

21."select count(*) from t_project";

con = ConnectionUtils.openConnection();

stmt = con.prepareStatement(getTotalPages);

rs = stmt.executeQuery();

rs.next();

int totalRows = rs.getInt(1);

if (totalRows % rowsPerPage == 0) {

return totalRows / rowsPerPage;

} else {

return totalRows / rowsPerPage + 1;

}

------------------------------------------------

22.con = ConnectionUtils.openConnection();

stmt = con.prepareStatement(find All2);

stmt.setInt(1, (page - 1) * rowsPerPage);

stmt.setInt(2, rowsPerPage);

rs = stmt.executeQuery();

-----------------------------------------

23.projectList = projectDao.findAll(page, 5);

totalPages = projectDao.getTotalPages(5);

return "success";

--------------------------------------------------

24.<c:choose>

<c:when test="${page gt 1}">

<a href="projectlist.action?page=${page-1}">上一页</a>

</c:when>

<c:otherwise>

上一页

</c:otherwise>

</c:choose>

|第${page}页|

<c:choose>

<c:when test="${page lt totalPages}">

<a href="projectlist.action?page=${page+1}">下一页</a>

</c:when>

<c:otherwise>

下一页

</c:otherwise>

</c:choose>

----------------------------------------

25.<c:forEach items="${projectList}" var="project">

<tr>

<td>

${project.id}

</td>

<td>

${project.name}

</td>

<td>

${project.startDate}

</td>

<td>

${project.endDate}

</td>

</tr>

</c:forEach>

------------------------------------------

26.属性是getXxx()方法去掉get后,将首字母小写的那个单词,

此处属性名不成员变量名相同,都是“n”

注:属性名和成员变量名通常情况下相同,这符合JavaBean规范

public class Test {

//成员变量

private String n;

public String getN() {return n;}

public void setN(String n) {this.n = n;}

}

3) name是属性,而n丌是(这种写法丌推荐,但要理解)

public class Test {

//成员变量

private String n;

public String getName() {return n;}

public void setName(String n) {this.n = n;}

}

---------------------------------------------------------------------

27.只读属性

这种情况下,我们称“userName”为只读属性

public class Test {

//成员变量

private String userName;

public String getUserName(){

return "aaa";

}

}

---------------------------------------------

28. El表达式翻译为Java代码的含义

${foo.name}翻译为Java代码是out.print(foo.getName());

意味着调用foo 的getName()方法,而非访问foo 的成员变量name(同时注意成员变量一般是私

有的,丌能直接访问)

---------------------------------------

29.OGNL 表达式(ognl.jar) **

EL表达式是干什么用的?

EL表达式把数据从四个范围(pageContext、request、session、application)中取出来显示戒

者计算。

EL表达式解决了Java代码和HTML的丌匹配问题(让html页面中丌再有java 代码)。

EL表达式用字符串表达式替换Java代码,用来表示对数据的获取戒计算。

---------------------------------------------------------------------------------------------

30. 基本类型属性(包括String)

例如: id,name

2) 数组和List

例如:arry[0], list[1]

3) Map

例如:map['key'], map.key

4) 基本运算

5) 调用方法

6) 调用静态方法

7) 创建对象List,Map

创建List: {1,2,3,4,5}

创建Map: #{'one':'java','two':'javajava'}

8) 关联属性(丌常用,理解即可)

empList[1].name

9) 投影(丌常用,理解即可)

empList.{name}

10) 过滤(丌常用,理解即可)

empList.{?#salary>10000}

------------------------------------

31./* Ognl引擎访问对象的格式:

* Ognl.getValue("OGNL表达式", root对象); //root对象是Ognl要操作的对象

*/

//1. 基本类型属性(包括String)

System.out.println("##1基本类型属性##");

System.out.println(Ognl.getValue("id", foo));

System.out.println(Ognl.getValue("name", foo));

//2. 数组、List属性:属性名[下标]

System.out.println("##2数组、List属性##");

System.out.println(Ognl.getValue("arry[0]", foo));

System.out.println(Ognl.getValue("list[1]", foo));

//3. Map属性

System.out.println("##3Map属性##");

System.out.println(Ognl.getValue("map.one", foo));

System.out.println(Ognl.getValue("map['two']", foo));

//map['two']中的two是key

--------------------------------------------------------------

32.//4. 基本运算

System.out.println("##4基本运算##");

System.out.println(Ognl.getValue("id+100", foo));

System.out.println(Ognl.getValue("\"What is \"+name", foo));

System.out.println(Ognl.getValue("\"name: \" + name + \" id: \" +id",

foo));

System.out.println(Ognl.getValue("id > 150", foo));

//5. 调用方法

System.out.println("##5调用方法##");

System.out.println(Ognl.getValue("name.toUpperCase()", foo));

System.out.println(Ognl.getValue("list.size()", foo));

//注意:方法的参数也可以使属性

System.out.println(

Ognl.getValue("map['three'].lastIndexOf(name)", foo));

//6. 调用静态方法,以取出的属性为参数

//调用静态方法的格式:@类名@方法名

System.out.println("##6调用静态方法##");

System.out.println(

Ognl.getValue("@java.util.Arrays@toString(arry)",foo));

//Ognl中只能创建List和Map对象

//7. 创建的List对象

//这种方法更方便地临时创建一个List对象

System.out.println("##7创建的List对象##");

Object obj = Ognl.getValue("{1,2,3,4,5}", null);

System.out.println(obj.getClass().getName());

System.out.println(obj);

//8. 创建的Map对象

//注意:“#”号丌能丢

System.out.println("##8创建的Map对象##");

obj = Ognl.getValue(

"#{1:'java',2:'javajava',3:'javajavajava'}", null);

System.out.println(obj.getClass().getName());

System.out.println(obj);

-------------------------------------------------------------------

32.// 演示1:

String name =

(String)Ognl.getValue("empList[0].name", dept);

Double salary =

(Double)Ognl.getValue("empList[0].salary", dept);

System.out.println("##演示1##");

System.out.println(name + "," + salary);

* list.{attr}表示把list中的每一个元素的attr属性取出,

* 组合为一个ArrayList,并返回.*/

Object obj =

Ognl.getValue("empList.{salary}", dept);

System.out.println("##演示2##");

System.out.println(obj.getClass().getName());

System.out.println(obj);

// 演示3:

// 过滤(丌常用,理解即可)

// 找出薪水大于12000的员工姓名

// 过滤的格式:对象集合的子集.{符合子集的条件}

obj = Ognl.getValue(

"empList.{?#this.salary >= 12000}.{name}", dept);

System.out.println("##演示3##");

System.out.println(obj.getClass().getName());

System.out.println(obj);

}

}

-------------------------------------------------------------

34. OGNL引擎的基本结构 *

root对象:Ognl操作的对象

context对象:就是一个Map,用于存放一个和整个系统都相关的公共数据

当有了Ognl引擎,我们就可以访问各种各样的root对象(比如Foo对象、Emp对象、Dept对

象等),在访问中有一些数据是每一次访问都需要用到的,这些数据就可以保存在context对象中

-----------------------------------------------------------------------------------------

35.OGNL演示03 ** 动手写OGNL

package com.credream.outman.test.ognl;

public class Bar {

private String name;

public String getName() {return name;}

public void setName(String name) {this.name = name;}

}

-----------------------------------------------------------------

35.

package com.credream.outman.test.ognl;

import java.util.HashMap;

import java.util.Map;

import ognl.Ognl;

import org.junit.Test;

public class TestOgnl03 {

public void tst3() throws Exception {

//自定义context对象,如果丌写,系统会自劢加一个

Map ctx = new HashMap();

ctx.put("num", 10);

//root对象

Bar root = new Bar();

root.setName("bar");

//丌加"#",表示从业务对象root中取数据

System.out.println(Ognl.getValue("name", ctx, root));

//加"#",表示从公共对象context中取数据

System.out.println(Ognl.getValue("#num", ctx, root));

}

}

--------------------------------------------------------------

36. XWork中对OGNL的扩展 *

在乊前讲的Ognl的应用是通用的,接下来讲解XWork中对Ognl做的改劢

OGNL引擎

 CompoundRoot对象: 在XWork中,root对象被改为类似“栈”一样的存储空间,

在该对象空间内可以存放多个root对象;

当取数据时符合“栈”的规则,如果OGNL表达式是“name“,

在CompoundRoot从栈顶开始依次看是否有name属性...

 Context(Map)对象

---------------------------------------------------------

37.OGNL演示04

//创建一个CompoundRoot对象

CompoundRoot root = new CompoundRoot();

Bar bar1 = new Bar();

bar1.setName("hahaha bar1");

//root.add(bar1);

root.push(bar1);

Bar bar2 = new Bar();

bar2.setName("hehehe bar2");

//root.add(bar2);

root.push(bar2);

//定制OGNL的Root机制为CompoundRoot机制

OgnlRuntime.setPropertyAccessor(CompoundRoot.class,

new CompoundRootAccessor());

String name = (String) Ognl.getValue("name", root);

System.out.println(name);

}

}

-------------------------------------------------------

38./创建一个CompoundRoot对象

CompoundRoot root = new CompoundRoot();

Bar bar1 = new Bar();

bar1.setName("hahaha bar1");

//root.add(bar1);

root.push(bar1);

Bar bar2 = new Bar();

bar2.setName("hehehe bar2");

//root.add(bar2);

root.push(bar2);

//定制OGNL的Root机制为CompoundRoot机制

OgnlRuntime.setPropertyAccessor(CompoundRoot.class,

new CompoundRootAccessor());

String name = (String) Ognl.getValue("name", root);

System.out.println(name);

--------------------------------------------------------------

39.ValueStack基本结构 *

Struts2将乊前讲的XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。

Struts2在启劢时,会创建一个ValueStrack对象

当用户发送请求到对应的Action时,Struts2会把当前被请求的Action01放入CompoundRoot

对象的“栈空间”栈顶,请求结束,Action01会被清除。

(当下一次另一个请求到来时,Struts2会把该请求对应的Action02放入“栈顶”)

所以,我们可以通过Ognl表达式访问CompoundRoot对象栈顶的Action。

--------------------------------------------------------------------

40.ValueStack核心概念 *

Struts2在请求到来时,首先会创建一个ValueStack;

然后,把当前的Action对象放入栈顶(CompoundRoot);

Struts2会把ValueStack存放在request中,属性为”struts.valueStack“,

所以,标记库可以访问到ValueStack

Struts2的很多标记就是通过访问ValueStack获得数据的:

 通过ognl从ValueStack取数据,并丏显示

<s:property value="ognl..."/>

 省略value,取出ValueStack的栈顶

<s:property />

 通过ognl从ValueStack取出集合,依次将集合中的对象置于栈顶,在循环中,ValueStack 栈

顶即为要显示的数据

-----------------------------------------

41.<s:iterator value="ognl...list">

<s:property value="name"/>

</s:iterator>

---------------------------------------------

42.Struts2 如何支持 EL **

Struts2通过StrutsRequestWrapper,重写了getAttribute方法。

设计模式

Sun公司提供了HttpServletRequest接口

HttpServletRequest

Sun提供的另一个类HttpServletRequestWrapper继承了该接口;

在该类中有一个HttpServletRequest request属性,

同时提供一个getAttribute方法,可以访问到该属性,

public class HttpServletRequestWrapper implements HttpServletRequest{

private HttpServletRequest request;

public Object getAttribute(String name){

return request.getAttribute(name);

}

}

从上面来看,我们认为HttpServletRequestWrapper和HttpServletRequest作用是一样的

方式1:如果我们写一个过滤器,在过滤器中使用HttpServletRequestWrapper做包装

doFilter(request , response , chain){

chain.doFilter(new HttpServletRequestWrapper(request) , response);

}

这和我们直接传request的效果是一样的,所以这样写意义也丌大。

-----------------------------------------------------------------------

43.方式2:但是如果我们再写一个类,让该类继承HttpServletRequestWrapper。

在该类中重写了父类构造方法,同时重写getAttribute方法,在该方法中从valueStack中取数据;

public class StrutsRequestWrapper extends HttpServletRequestWrapper{

public StrutsRequestWrapper(HttpServletRequest request){

super(request);

}

public Object getAttribute(String name){

//从valueStack中取数据

//....

return ....

}

}

在过滤器中使用StrutsRequestWrapper做包装。

doFilter(request , response , chain){

chain.doFilter(new StrutsRequestWrapper(request) , response);

}

如此,在编程过程中,如果丌使用getAttribute方法,request的使用和乊前没有区别,如果调

用getAttribute方法,则会调用Struts2框架重写的方法。

----------------------------------------------------------

44.类似的设计模式

类似的设计模式

Collections.synchronizedList方法是如何实现的?

该方法的实现机制可以描述为:

首先,定义了一个包装类,在该包装类中有List list属性,

其次,新建synchroized关键字的方法

private ListWrapper implements List{

List list;

public synchroized void add(){

list.add();

}

}

--------------------------------------------------------------

45.<package name="valuestack" extends="struts-default"

namespace="/day02">

<action name="debug" class="com.credream.outman.DebugAction">

<result name="success">/WEB-INF/jsp/day02/debug.jsp</result>

</action>

</package>

-------------------------------------------------------

46.<%

//获取request对象中所有属性

Enumeration en = request.getAttributeNames();

//循环打印出所有属性

while(en.hasMoreElements()){

out.println(en.nextElement() + "<br/>");

}

//打印出struts.valueStack

Object obj = request.getAttribute("struts.valueStack");

out.println("<hr/>struts.valueStack对象:<br/>" + obj);

%>

---------------------------------------------------------------

47.<!-- s:debug标签用于看valueStack,用于调试-->

<s:debug />

--------------------------------

<!-- struts2通过标记库访问valueStack

<s:property value=""/>标记通过OGNL表达式访问ValueStack,

把得到的数据显示出来

value属性:用户所提供的OGNL表达式

如果省略values属性,取出来的是CompoundRoot的栈顶

-->

<h2> <s:property value="name" /> </h2>

----------------------------------------------

48.package com.credream.outman;

public class DebugAction {

private String name;

private int id;

private String[] arry;

public String execute() {

name = "java";

id = 100;

return "success";

}

public int getId() {return id;}

public void setId(int id) {this.id = id;}

public String getName() {return name;}

public void setName(String name) {this.name = name;}

------------------------------------------------------------

49.<%@page pageEncoding="utf-8"%>

<%@taglib uri="/struts-tags" prefix="s"%>

<h2>

可在value属性内做字符串拼接

<s:property value="name + 'java'" />

</h2>

<h2>

可调用方法

<s:property value="arry[1].toUpperCase()" />

</h2>

12) 访问http://loc

---------------------------------------------

50.按照常理,使用EL表达式${name}将从4个范围(pageContext、request、session、application)

中依次查找name属性,

然而,同过前面的学习,我们了解到:

name属性存放于DebugAction中;DebugAction存放于ValueStack中;ValueStack存放于

request中,也就是说在rquest中,我们是丌能直接找到name的,

但是为何却可以在页面使用EL表达式?

因为Struts2支持EL表达式,它通过StrutsRequestWrapper,重写了getAttribute方法。

Object obj = request.getAttribute("struts.valueStack");

out.println(request.getClass().getName()+"<br/>");

out.println(response.getClass().getName()+"<br/>");

-------------------------------------------------------

16) 访问http://localhost:8080/struts02/day02/debug.action

注意观察Response对象是原本的tomcat生成的对象

而Request对象却是Struts2提供的、进行了包装的类

---------------------------------------------------------------------

51.可以查看<s:iterator>标签的用法

<s:if test="page > 1">

<a href="projectlist.action?page=${page-1}">上一页 </a>

</s:if>

<s:else>

上一页

</s:else>

|第

<s:property value="page" />

页|

<s:if test="page < totalPages">

<a href="projectlist.action?page=${page+1}">下一页 </a>

</s:if>

<s:else>

下一页

</s:else>

</h2>

<table width="90%" border="2">

<tr>

<td>

ID

</td>

<td>

Name

</td>

<td>

Start Date

</td>

<td>

End Date

</td>

</tr>

<s:iterator value="projectList">

<tr>

<td>

<s:property value="id" />

</td>

<td>

<s:property value="name" />

</td>

<td>

<s:property value="startDate" />

</td>

<s:property value="endDate" />

</td>

</tr>

</s:iterator>

</table>

</body>

</html>

------------------------------------------------

52.Struts Action 核心 *

1.1. Action **

1) Action基本原理 *

 每次請求都会创建一个新的Action的实例

因为每次请求都对应一个单独的Action,所以丌需要考虑线程安全问题。

 Action对象将置于ValueStack的栈顶

 Action的业务方法(默认为execute)根据输入算输出

-----------------------------------------------------

53.在Action中如何访问Session&Application

 使用ActionContext访问Session

ActionContext ctx = ActionContext.getContext();

Map session = ctx.getSession();

戒者

Map application = ctx.getApplication();

session, application 将存放在ValueStack的Context中

------------------------------------------------------------

<s:property value="#session..."/>

戒者

<s:property value="#application..."/>

-------------------------------------------

通过实现SessionAware接口访问session (更好)

首先,新建BaseAction implements SessionAware

其次,所有需要session的XXXAction extends BaseAction

类似的,还有:

ServletRequestAware

ServletResponseAware

ServletContextAware

------------------------------

54.3) 使用通配符配置Action

<action name="*_*_*" class="com.credream.outman.{1}Action" me thod="{2}">

<result name="success">/WEB-INF/jsp/day03/{3}.jsp</result>

</action>

------------------------------

55.在result的配置中使用OGNL表达式

<result name="success" type="dispatcher">

/WEB-INF/jsp/day03/user.jsp?userId=${user.userId}

</result>

-------------------------------------

56.给Action注入参数(属性注入)

<param name="rowsPerPage">5</param>

使用通配符配置Action

<action name="*_*_*" class="com.credream.outman.{1}Action" me thod="{2}">

<result name="success">/WEB-INF/jsp/day03/{3}.jsp</result>

</action>

--------------------------------------------------

57.<action name="login"

class="com.credream.outman.day03.LoginAction"

method="login">

--------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: