struts2知识系统整理

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("@[email protected](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">
--------------------------------------------------------------

struts2知识系统整理,布布扣,bubuko.com

时间: 2024-10-14 18:21:51

struts2知识系统整理的相关文章

struts2 知识梳理

一:struts.xml配置详解: 1.<include> 表示引入其他配置文件 2.<constant> 定义常量 3.<package>:  属性 是否必需 描述name 是 包名,作为其它包应用本包的标记extends 否 设置本包继承其它包namespace 否 设置包的命名空间,会改变url,abstact 否 设置为抽象包 4<action>和<result> <action>有name,class,method,conv

SQL基础知识回顾整理

20150929~20151016所学SQL基础知识回顾整理,后续完善补充 服务器名称:是指你要连接的安装的数据库服务器所在的那台电脑的ip地址,如果是本机的话,就是  . mdf 结尾:数据库数据文件,一个数据库有且只有一个 ldf:数据库日志文件,一个数据库有且至少有一个 数据库中存放数据的结构,是通过表的形式来存储的,一个数据库中有很多个表 基础知识(创建.使用数据库及创建表.添加数据.删除表) 约束 查询 子查询 表连接 视图 各类函数 存储过程 触发器 分页语句 事务 20150929

Linux Basics 知识框架整理

本博文目录索引 [TOC] 第01章 在VMware Fusion虚拟机中安装CentOS实验环境 1.1 实验:手动安装CentOS 1.2 reset.sh 脚本 本章总结 第02章 Bash Shell特性 2.1 命令提示符 2.2 实验:定制命令提示符格式 2.3 执行命令 2.4 命令别名 2.5 tab键补全 2.6 命令行历史 2.7 Bash快捷键 本章小结 第03章 获取Linux帮助 3.1 whatis 3.2 help(内部命令) 3.3 帮助选项 3.4 man手册(

Struts2 知识体系

1.struts2是什么 struts2是用于企业级Web开发的框架,基于struts2开发Web应用程序,在开发效率.可扩展性.可维护性上都会大有提升. 2.struts2的优点 struts2框架是典型的实现了MVC架构的框架,使用struts框架,通过struts2.xml文件配置非常容易的将数据层(模型).控制层和视图展现层分离,开发出架构清晰的项目. 3.struts2的运行机制 参见博客:http://www.cnblogs.com/tengpan-cn/p/5210155.html

算法知识目录整理

算法知识目录整理 1. 算法部分 二分搜索 Binary Search 分治 Divide Conquer 宽度优先搜索 Breadth First Search 深度优先搜索 Depth First Search 回溯法 Backtracking 双指针 Two Pointers 动态规划 Dynamic Programming 扫描线 Scan-line algorithm 快速排序 Quick Sort 2. 数据结构部分 栈 Stack 队列 Queue 链表 Linker List 数

Struts2知识复习之一

#Struts2知识复习之一 概述:struts2是一个基于MVC设计模型的轻量级web应用框架,它本质上相当于servlet.它是 Struts1(早期基于MVC模式的轻量级Web框架) 和 WebWork(openSymphony组织的J2EE Web框架)技术的合并.它的核心是WebWork,采用拦截器的机制来处理用户请求,使业务逻辑控制器与ServletAPI脱离. struts2优势: 提供Exception异常处理机制 提供良好的Ajax支持 Result方式的页面导航,通过Resu

Struts2知识整理

参考(http://www.cnblogs.com/wang-meng/) Struts2框架的大致处理流程如下: 1.加载类(FilterDispatcher) 2.读取配置(struts配置文件中的Action) 3.派发请求(客户端发送请求) 4.调用Action(FilterDispatcher从struts配置文件中读取与之相对应的Action ) 5.启用拦截器(WebWork拦截器链自动对请求应用通用功能,如验证) 6.处理业务(回调Action的execute()方法) 7.返回

Java知识系统回顾整理01基础01第一个程序01JDK 安装

一.首先第一步看JDK配置成功后的效果 点WIN键->运行(或者使用win+r) 输入cmd命令 输入java -version?注:?-version是小写,不能使用大写,java后面有一个空格 配置成功后,会出现版本信息?java version "1.8.0_65" 注:?这是配置完成后的效果,在配置完成之前是看不到这个效果的 ? ? ? ? 二.下载安装JDK 可以去JDK官网下载,按照官方指导一步步安装 或者按照本文提供的免安装版的方式,下载免安装版本并解压.本文免安装

Java知识系统回顾整理01基础01第一个程序04创建Eclipse项目

一.为Eclipse设置桌面快捷方式图标 ? ? ? ? 二.双击桌面快捷方式打开Eclipse ? ? 三.选择工作区 使用在命令行Hello World中的项目目录e:\project 除了第一次启动eclipse的时候能够选择工作区之外,还可以在启动之后,通过如下命令进行工作区的选择:? File -> Switch Workspace 选择e:\project作为工作区 ? ? 四.创建Java项目 如果是第一次创建Java项目 File->New->Other->Java