Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

Struts 2 Action类可以实现一个Action接口,也可实现其他接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象
ps: pojo , 简单的Java对象(Plain Ordinary Java Objects)实际就是普通JavaBeans,使用POJO名称是为了避免和 EJB混淆起来, 而且简称比较直接.

Action类没有直接与request,response打交道,已经与Servlet API完全分离,可通过方法名形参看出来,但我们在实现业务逻辑处理时经常需要访问Servlet中的对象,如Session、Application等。Struts2.0 提供了一个名字为ActionContext的类,在Action中可以通过该类获得Servlet API。

ActionContext是一个Action的上下文对象,Action运行期间所用到的数据都保存在ActionContext中(如Session,客户端提交的参数等信息)。在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程中使用。

在Action中可以通过下面的代码来创建和使用ActionContext类,关于该类的方法介绍如下所示:
ActionContext ac=ActionContext.getContext();

以下是ActionContext类的常用方法
1.Object get(Object key) :通过参数key来查找当前ActionContext中的值
2.Map getApplication() :返回一个Application级的Map对象
3.Static ActionContext getContext() :获得当前线程的ActionContext对象
4.Map getParameters() :返回一个包含所有HttpServletRequest参数信息的Map对象

5.Map getSession() :返回一个Map类型的HttpSession对象

我们取得的session却是Map类型的对象,这是为什么?框架将与Web相关的很多对象重新进行了包装,比如这里就将 HttpSession对象重新包装成了一个Map对象,供我们的Action使用,而不用直接和底层的HttpSession打交道。也正是框架的包装,让我们的Actoion可以完全的和Web层解藕。

6.Void put(Object key,Object value) :向当前ActionContext对象中存入名值对信息
7.Void setApplication(Map application) :设置Application上下文
8.Void setSession(Map session) :设置一个Map类型的Session值

如果我们的Action需要直接与JavaServlet的HttpSession、HttpServletRequest等一些对象进行操作,我们又该如何处理?请看下面的ServletActionContext。

ServletActionContext
这个类直接继承了我们上面介绍的ActionContext,它提供了直接与JavaServlet相关对象访问的功能

1、取得HttpServletRequest对象:

HttpServletRequest request = ServletActionContext. getRequest();

2、取得HttpSession对象:
HttpSession session = ServletActionContext. getRequest().getSession();

ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象。在使用ActionContext时有一点要注意:不要在Action的构造函数里使用 ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过 ActionContext取得的值也许是null。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1, dispatcher -forward 转到指定的jsp页面
2,redirect 重定向到jsp页面或action
3,chain 由当前action转到另一action, 形成一个action链,彼些间共享一个ActionContext,在一个action中设置ActionContext属性,可被其它action共享。

redirect 与 dispatcher的区别与 reidrect,forward相似

一、dispatcher

(1)为缺省的result类型,一般情况下我们在struts.xml会这么写:
Xml代码

1. /main.jsp

/main.jsp

以上写法使用了两个默认,其完整的写法为:
Xml代码

1.
2. /maini.jsp 3.

/maini.jsp

第一个默认:type=”dispatcher”;第二个默认:设置的为location参数,location只能是页面,不能是另一个action(可用type=”chain”解决)。

(2)实现方式

从doExecute方法看出,有三个出口(finalLocation为要跳转的地址):

*

pageContext.include(finalLocation);
*

dispatcher.forward(request, response); (dispatcher是根据finalLocation创建的)
*

dispatcher.include(request, response);

而我们知道,forward与include都是转发到context内部的资源。

二、redirect

(1)可以重定向到一个页面,另一个action或一个网址。
Xml代码

1. aaa.jsp
2. bbb.action
3. www.baidu.com

aaa.jsp
bbb.action
www.baidu.com

(2)实现方式:

查看doExecute方法,只有一个出口:

response.sendRedirect(finalLocation);

sendRedirect是重定向,是重新产生一个HTTP请求到服务器,故重定向后其原来所在的action上下文就不可用了。

三、chain

(1)主要用于把相关的几个action连接起来,共同完成一个功能。
Xml代码


step2 //注:是step2而不是step2.action


finish.jsp

(2)实现方式:

查看execute()方法,主要思想如下:

// 根据Action名称finalActionName及要调用的方法finalMethodName来new一个代理对象proxy,并执行之
Java代码

proxy = actionProxyFactory.createActionProxy(finalNamespace,
finalActionName, finalMethodName, extraContext);
proxy.execute();

(3)多个action间数据的传递

主要有两种方式:

1)由于处于chain中的action属于同一个http请求,action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失,共享一个ActionContext,故可以在上下文中获取,在页面上可以直接使用。手动获取的
方法如下:

Java代码

HttpServletRequest request = ServletActionContext.getRequest();
String s=(String)request.getAttribute(“propName”);

2)实现ModelDriven接口

在Step1Action中,加入getModel:
Java代码

1. public Object getModel() {
2. return message;
3. }

public Object getModel() {
return message;
}

在Step2Action中,加入setModel:
Java代码

1. public void setModel(Object o){
2. System.out.println(“message is:”+o);
3. }

public void setModel(Object o){
System.out.println(“message is:”+o);
}

注意,setModel的调用先于execute()方法后于构造方法。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

一、Struts2.0的创建
1),添加jar包
?? 1, commons-fileupload-1.2.1.jar
?? 2, commons-io-1.3.2.jar
?? 3, commons-logging-1.0.4.jar
?? 4, freemarker-2.3.13.jar
?? 5, ognl-2.6.11.jar
?? 6, struts2-core-2.1.6.jar
?? 7, xwork-2.1.2.jar
注:要与Spring整合,让Spring托管Struts的Action,那么需要添加Struts2.0的
???????? struts2-spring-plugin-2.1.6.jar
2),创建struts.xml,放在src目录下,并添加相应的action
? <?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE struts PUBLIC
“-//Apache Software Foundation//DTD Struts Configuration 2.0//EN”
http://struts.apache.org/dtds/struts-2.0.dtd“>
<struts>??

<include file=”struts-default.xml”/>
<package name=”com.login”? extends=”struts-default”>
?<action name=”login” method=”login”>???
?<result name=”success” type=”redirect”>success.jsp</result>
</action>???
</package>
??? </struts>
3), 在web.xml加入filter,
????????????? (注:用过滤器的原因是:要对传来的各种url进行分类,转向,即过滤。相似的还有servlet
?????????????????????? 而Spring用监听器,listen,当监听到action创建时就注入属性)
<filter>
<filter-name>struts2</filter-name>
<filter-class>
??? org.apache.struts2.dispatcher.FilterDispatcher? //默认就会读取src下的struts.xml
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
4), 做jsp即可


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

注:要与Spring整合,让Spring托管Struts的Action,那么需要添加Struts2.0的
????? struts2-spring-plugin-2.1.6.jar
注入效果:action的属性对象会自动被Spring创建,在action中只需引用即可

1,添加Spring能力
选中以下及自动关联的类库
String 2.0 Core Libraries
String 2.0 Persistence JDBC Libraries
String 2.0 Web Libraries

2, 在web.xml添加spring监听器
<listener>
<listener-class>
??? org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

注:若不用Spring来为Struts的action进行自动属性注入,那么就不必为spring配置监听器,且也不用导入
struts2-spring-plugin-2.1.6.jar, 直接在代码中进行手动注入:
?????????? ApplicationContext context = new ClassPathXmlApplicationContext( “applicationContext.xml” );
????????? ComeAction comeAction = (ComeAction) context.getBean( “comeAction” );
可看出在web.xml配置的多为struts与servlet,因为它们要拦截页面请求的url进行转向,而配置
?? Spring监听器的原因是为了监听Struts action的建立并为其动态注入属性。

3, 将applicationContext.xml放置在web-inf下, 名字可任意如ac.xml,ab.xml
不过要在web.xml指定??
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/a*.xml </param-value>
</context-param>
注:<context-param>也可不加,默认读取的是/WEB-INF/下的applicationContext.xml,只要?????? applicationContext.xml放置在web-inf下即可。

4, 配置 applicationContext.xml, 创建相应的注入属性
如:loginAction有一个userDao属性,设置了get,set方法,那么在 applicationContext.xml,配置:
??? <bean id=”userDao”>
???? </bean>
注:1,loginAction中的属性名userDao一定要与applicationContext.xml中的bean的id相同!!!!!
这样Spring才能自动注入action的属性。指的是与setUserDao()中userDao相同,变量名不必要相同。
因为在注入时,会根据配置文件中的userDao调用action的setUserDao方法,只要此方法存在即可!!
???? ( 以下2,3可不用配 )
?????? 2, 在struts.properties中设置struts.objectFactory属性值
?????????? struts.objectFactory = spring?
????????? 或者是在XML文件中进行常量配置
?????????? struts.xml???? <constant name=”struts.objectFactory” value=”spring” />?
???? 3, 在struts.properties中指定注入方式。name 按照你的action的属性的名字和Spring里的bean的名字匹配,如果匹配就自动装配。这是缺省的
type 按照你的action的属性的类型,在Spring注册的bean中查找,如果相同就自动装配。这需要你在Spring中仅注册了一个此类型的bean
auto Spring会试图自动监测来找到最好的方法自动装配你的action
constructor Spring会自动装配bean的构造函数的参数
ps :
在action的class指定具体的类,Spring自动完成属性的注入,
在action的class指定bean id, Spring托管整个action生命周期.
1, 属性注入:
(1) struts.xml中配置:
?<action name=”login” method=”login”>???
<result name=”success” type=”redirect”>success.jsp</result>
</action>
(2) applicationContext.xml中配置
?在applicationContext.xml中配置此action的属性,要注意的是bean id 要与action内的属性名相同,不用为???????????????? LoginAction本身定义bean id.
这样Spring就只负责action属性的注入,

2, 所有注入:?? 让spring不仅负责action属性的创建,还负责action本身的创建.
? (1) struts.xml中配置:??
?? struts.xml中配置:
? <action name=”login” method=”login”>???
<result name=”success” type=”redirect”>success.jsp</result>
?</action>
? class为Spring中applicationContext.xml中的bean id
?(2) applicationContext.xml中配置
??? 配置loginAction的bean即可.
所有注入的好处: 结合aop,可完成对action执行具体方法时进行拦截,进行日志记录等.


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

<!DOCTYPE struts PUBLIC “-//Apache Software Foundation//DTD Struts

Configuration 2.0//EN” “http://struts.apache.org/dtds/struts-2.0.dtd” >
<struts>

<!– include节点是struts2中组件化的方式 可以将每个功能模块独立到一

个xml配置文件中 然后用include节点引用 –>
<include file=”struts-default.xml”></include>
<!– package提供了将多个Action组织为一个模块的方式
?package的名字必须是唯一的 package可以扩展 当一个package扩展自
?另一个package时该package会在本身配置的基础上加入扩展的package
?的配置 父package必须在子package前配置
?name:package名称
?extends:继承的父package名称
?abstract:设置package的属性为抽象的 抽象的package不能定义action 值true:false
namespace:定义package命名空间 该命名空间影响到url的地址,例如此命名空

间为/test那么访问是的地址为http://localhost:8080/struts2/test/XX.action?? –>

<package name=”com.kay.struts2″ extends=”struts-default” namespace=”/test”>
<interceptors>
??? <!– 定义拦截器
???????? name:拦截器名称
???????? class:拦截器类路径
???? –>
??? <interceptor name=”timer”

class=”com.kay.timer”></interceptor>
??? <interceptor name=”logger”

class=”com.kay.logger”></interceptor>
??? <!– 定义拦截器栈 –>
??? <interceptor-stack name=”mystack”>
??????? <interceptor-ref name=”timer”></interceptor-ref>
??????? <interceptor-ref name=”logger”></interceptor-ref>
??? </interceptor-stack>
</interceptors>

<!– 定义默认的拦截器 每个Action都会自动引用
? 如果Action中引用了其它的拦截器 默认的拦截器将无效 –>
<default-interceptor-ref name=”mystack”></default-interceptor-

ref>
<!– 全局results配置 –>
<global-results>
??? <result name=”input”>/error.jsp</result>
</global-results>

<!– Action配置 一个Action可以被多次映射(只要action配置中的name

不同)
????? name:action名称
????? class: 对应的类的路径
method: 调用Action中的方法名
–>
<action name=”hello”

class=”com.kay.struts2.Action.LoginAction”>
??? <!– 引用拦截器
???????? name:拦截器名称或拦截器栈名称
???? –>
??? <interceptor-ref name=”timer”></interceptor-ref>

??? <!– 节点配置
???????? name : result名称 和Action中返回的值相同
???????? type : result类型 不写则选用superpackage的type struts

-default.xml中的默认为dispatcher
???? –>
?<result name=”success” type=”dispatcher”>/talk.jsp</result>
?<!– 参数设置
????? name:对应Action中的get/set方法
?–>
?<param name=”url”>http://www.sina.com</param>
</action>
</package>
</struts>
ps: package? extends
<package name=”com.manage.checkLogin” extends=”struts-default”>
….
</package>

<package name=”com.manage.news” namespace=”/manage/news” extends=”com.manage.checkLogin”>
….
</package>

当多个配置文件都要引用一个package时,可将其放入一配置文件中,在struts.xml include其它文件的同时,include此文件,接着在各配置文件中直接extends此包即可。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

<c:forEach var=”modules” items=”${SES_powers.modules}” varStatus=”status”>
?????
? </c:forEach>

SES_powers.modules 会自动调用SES_powers的getModules()方法,(即使没有modules这个变量),这样避免了在页面中引用JAVA代码


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

EI是jsp-2.0规范的一部分,tomcat-5.x版本以上都已经能够支持jsp-2.0规范,
<%@ page isELIgnored=”true” %> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言。

.语法结构(1)使用el的时候,默认会以一定顺序搜索四个作用域,将最先找到的变量值显示出来。

??? ${expression}

1,与页面元素的操作:
??

如果我们有${username}这样一个正则表达式,它回去依次调用pageContext.getAttribute(“username”) -> request.getAttribute(“username”) -> session.getAttribute(“username”) -> application.getAttribute(“username”),只要找到某一个不为空的值就立刻返回。

?(2)指定具体的域

??????

el中的作用域 对应关系
pageContext(1) 当前页的pageContext对象
pageScope 把page作用域中的数据映射为一个map对象
requestScope(2) 把request作用域中的数据映射为一个map对象
sessionScope 把session作用域中的数据映射为一个map对象
applicationScope 把application作用域中的数据映射为一个map对象
param 对应request.getParameter()
paramValues(3) 对应request.getParameterValues()
header(4) 对应request.getHeader()
headerValues 对应request.getHeaderValues()
cookie(5) 对应request.getCookies()
initParam(6) 对应ServletContext.getInitParamter()

?? session.getAttribute(“username”)?? 等同于 ${sessionScope:username}

?? request.getParameter(String name)? 等同于 ${param:name}

(3)EI运算符

???? ${ 1 + 2 }? 结果:3

???? ${ 1 <= 2 } 结果: true

??? ${ true && false } 结果:false

??? ${ empty 2 } 结果:false //判断对象是否为空

??? ${ not empty 2 }结果:true

?? ${ 2>1 ? “yes” : “no” }

? 对string类型进行操作:

? ${fn:substring(booking.orderId,0,6)}

?? fn:contains(string, substring)? fn:endsWith(string, suffix)?? fn:length(item)? fn:split(string, separator)? fn:trim(string)

(4)调用对象方法

<c:forEach var=”modules” items=”${SES_powers.modules}” varStatus=”status”>
?????
? </c:forEach>

SES_powers.modules 会自动调用SES_powers的getModules()方法,(即使没有modules这个变量),这样避免了在页面中引用JAVA代码

注:向方法中传参http://tech.ddvip.com/2009-04/1238857014113535.html

一般最好在程序中就将数据取出,在JSP页面只进行读取数据的操作

(5)集合操作

Map
Map mapValue? = new HashMap();
?? mapValue.put(“key1”, “value1”);
?? mapValue.put(“key2”, “value2”);

request.setAttribute(“mapvalue”, mapValue);
———————————————El表达式获取
<li>输出map,采用.进行导航,也称存取器</li><br>
mapvalue.key1:${mapvalue.key1 }<br>
mapvalue.key2:${mapvalue.key2 }<br>

?List

${userlist[4].username }

(6)数组

? User[] users = new User[10];

${users[2].username }


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,创建变量 <c:set>
<c:set>标签具有以下一些属性:
var:所定义或者使用的变量的名称。
scope:该变量的作用域,缺省值为page。
value:变量的值。
target :javabean名称,若存在必须指定property属性
property:javabean实例名称
例:
<c:set var=”i”? value=”0″/>
应用: ${i}

<c:set value=”xiaoT” target=”${User}” property=”userName”>
相当于:User u = new User(); u.setUserName( “xiaoT” );

2, 输出? <c:out>????? 如<c:out value=”${i}”>? 等同于 ${i}

3, 分支语句
<c:if test=”${1<2}”>????? <a href=”index.action”>index</a>??? <c:if>
在满足条件时输出 <a href=”index.action”>index</a>
因没有<c:else> 多重分支为:
<c:choose>
<c:when test=”${1<2}”>?????? </c:when>??????????????? 等同于<c:if> 为 if
<c:otherwise>?????????????????????????????????????????????????????? 等同于?????????
</c:choose>

4, 数据格式化函数

格式化日期
<fmt:formatDate value=”${isoDate}” type=”both”/>

-定制数字格式时,# 表示按照默认格式来
:<fmt:formatNumber value=”1234567890″ type=”number” pattern=”#,#00.0#” />?

将字符串转化到正确的数字
<fmt:parseNumber type=”number” >123.02a</fmt:parseNumber>


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

得到action, request, session传来的数据
action? #property
<s:property value=”#session[‘key’]”/>?? 或 <s:property value=”#session.key”/>?

<s:select list=”#request.allModules” listKey=”every” listValue=”name” name=”powerInfo.fid”/>

${sessionScope.key}?? //注:struts2.0标签中若用EI表达式,可能会得不到值

Struts2.0标签 实现了JSTL + EI? 功能

非UI
1,选择
<s:if test=””></s:if>
<s:elseif test=””></s:elseif>
<s:else></s:else>—–这3个标签一起使用,表示条件判断
<s:if test=”#session[‘key’]==null”>?

2,循环
<s:iterator id=”book” value=”books” status=”index”>?

<!—输出当前元素的属性–>?
<s:property value=”property”/>?

<!—输出当前迭代元素的索引–>?
<s:property value=”#index.index”/>?

<!—输出当前迭代了几个元素–>?
<s:property value=”#index.count”/>??

<!—返回当前迭代元素的索引是否为奇数–>?
<s:property value=”#index.odd”/>??

<!—返回当前迭代元素的索引是否为偶数–>?
<s:property value=”#index.event”/>?

<!—返回当前元素是否为第一个–>?
<s:property value=”#index.first”/>?

<!—返回当前元素是否为最后一个–>?
<s:property value=”#index.last”/>?

</s:iterator>?
UI
1,URL
(1)? <s:url value=”editGadget.action”/>????????????? 区别于:<s:a href=”index.jsp”> <s:a href=””></s:a>—–超链接,类似于html里的<a></a>

(2)?? <s:url action=”showBook”>
??? <s:param name=”author” value=”‘yeeku'” />
</s:url>

(3)?? <s:url id=”url” action=”preModifyCategoryName” includeParams=”get” namespace=”/category”>
??? <s:param name=”categoryId” value=”%{categoryId}”/>
?</s:url>

注:<s:actionerror/>—–如果action的errors有值那么显示出来
<s:actionmessage/>—–如果action的message有值那么显示出来

2,下拉框
(1) <s:combobox label=”请选择您喜欢的图书” theme=”css_xhtml” labelposition=”top”
list=”{‘Spring2.0宝典’ , ‘轻量级J2EE企业应用实战’ , ‘基于J2EE的Ajax宝典’}”
size=”20″ maxlength=”20″ name=”book”/>

与<s:select …/>标签不同的是,对于下面的下拉列表,无需指定listKey和listValue属性,因为此处的下拉列表,不再用于发送请求参数,而仅仅是用于辅助输入,因此该下拉列表的value没有任何意义
(2) Select
?List
<s:select name=”b” label=”请选择您喜欢的图书” labelposition=”top” multiple=”true”
??? list=”#bs.books”
??? listKey=”author”
??? listValue=”name”/>
Map
<s:select name=”b” label=”请选择您想选择出版日期” labelposition=”top”
??? list=”#{‘Spring2.0宝典’:’2006年10月’ , ‘轻量级J2EE企业应用实战’:’2007月4月’ , ‘基于J2EE的Ajax宝典’:’2007年6月’}”
??? listKey=”key”
??? listValue=”value”/>

<tr>
??? <td align=”center”>父权限</td>
??? <td align=”center”>
??? <s:select theme = “simple” label = “父权限”? list=”#request.allModules” listKey=”id” listValue=”name” name=”powerInfo.fid”/>
???? </td>???
?</tr>???????? //加theme = “simple”代表只生成一个简单的select,不用其自动生成<tr>之类, label就是在自动生成的情况下指示前td名称
????????????????? 注:listKey代表<option value>中的value值,?????? listValue 为<option>listValue</option>之间的数据

3,多个checkbox
(1) List
<s:checkboxlist name=”a” label=”请选择您喜欢的图书” labelposition=”top”
list=”{‘Spring2.0宝典’ , ‘轻量级J2EE企业应用实战’ , ‘基于J2EE的Ajax宝典’}”/>

<s:checkboxlist name=”b” label=”请选择您喜欢的图书” labelposition=”top”
list=”#bs.books”
listKey=”name”
listValue=”author”/>
(2)Map
<s:checkboxlist name=”b” label=”请选择您想选择出版日期” labelposition=”top”
list=”#{‘Spring2.0宝典’:’2006年10月’ , ‘轻量级J2EE企业应用实战’:’2007月4月’ , ‘基于J2EE的Ajax宝典’:’2007年6月’}”
listKey=”key”
listValue=”value”/>

4, s:radio生成多个单选框
<s:radio name=”c” label=”请选择您喜欢的图书” labelposition=”top”
list=”#bs.books”
listKey=”author”
listValue=”name”/>

5 s:optiontransferselect来生成可移动列表项的下拉列表框 , s:optgroup生成下拉选择框的选项组
s:updownselect生成可上下移动选项的下拉选择框 ,?????????????? s:doubleselect生成级联下拉列表框
s:tree和s:treenode标签生成静态树 ,

<s:tree label=”计算机图书” id=”book” theme=”ajax”
showRootGrid=”true” showGrid=”true” treeSelectedTopic=”treeSelected”>
<s:treenode theme=”ajax” label=”李刚” id=”yeeku”>
<s:treenode theme=”ajax” label=”Spring2.0宝典” id=”spring”/>
<s:treenode theme=”ajax” label=”轻量级J2EE企业应用实战” id=”lightweight”/>
<s:treenode theme=”ajax” label=”基于J2EE的Ajax宝典” id=”ajax”/>
</s:treenode>
<s:treenode theme=”ajax” label=”David” id=”David”>
<s:treenode theme=”ajax” label=”JavaScript: The Definitive Guide” id=”javascript”/>
</s:treenode>
<s:treenode theme=”ajax” label=”Johnson” id=”Johnson”>
<s:treenode theme=”ajax” label=”Expert One-on-One J2EE Design and Development” id=”j2ee”/>
</s:treenode>
</s:tree>

7, s:append标签拼接两个集合
<s:append id=”newList”>
<s:param value=”{‘Spring2.0宝典’,’轻量级J2EE企业应用实战’,’基于J2EE的Ajax宝典’}” />
<s:param value=”{‘新东方IT培训’, ‘东方标准职业教育’}” />
</s:append>

8, 使用s:generator生成集合
使用generator标签可以将指定字符串按指定分隔符分隔成多个子串,临时生成的多个子串可以使用iterator标签迭代输出。可以这样理解:generator将一个字符串转化成一个集合。在该标签的标签体内,整个临时生成的集合将位于ValueStack的顶端,但一旦该标签结束,该集合将被移出ValueStack。

<s:generator val=”‘Spring2.0宝典,轻量级J2EE企业应用实战,基于J2EE的Ajax宝典'”
separator=”,” id=”books” count=”2″/>
${books} 代表一个Iterator?? s:iterator>

<s:generator val=”‘Spring2.0宝典,轻量级J2EE企业应用实战,基于J2EE的Ajax宝典'” separator=”,”>
<s:iterator status=”st”>
<tr <s:if test=”#st.odd”>style=”background-color:#bbbbbb”</s:if>>
<td><s:property/></td>
</tr>
</s:iterator>
</s:generator>

9,<s:datetimepicker></s:datetimepicker>—–日期输入框,
<s:file></s:file>—–文件上传
<s:form action=””></s:form>—–获取相应form的值
<s:text name=””></s:text>—–I18n文本信息
<s:textarea></s:textarea>—–文本域输入框
<s:textfield></s:textfield>—–文本输入框


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,分区注意:
(1)一个挂载点? 为”/” ,自动分配boot,home等,挂载点 格式为ext3
(2)一个挂载点为”swap” 大小为内存的2倍
只要这两个挂载点即可,格式为swap
2, 若先装xp,之后安装的linux,在分区时注意的是不要将xp格掉或丢失其它盘的信息,一般下, hd1为c盘,hd5为d盘待,格式为fat或nfts
不要在关键盘上安装linux,要先空出一个盘来装linux
3, 装完linux后中,又装xp,会将linux的引导程序覆盖掉,造成开机直接进入xp,不能进入linux,解决方法:
(1)从光盘启动,在安装初始画面输入:linux rescue 进行修复区
(2)选择语言,网络等一直进入命令行,输入:
???????? chroot /mnt/sysimage
???????? grub -install /dev/hax? (可先用fdisk -l 确定linux在哪个盘上,从而确定x)
(3)之后若进入grub grub>? 输入:find /boot/grub/grub.conf 或find /boot/grub/menu.lst? 确定(hd0,1)
???? root (hd0,1)? (要有空格)
???? setup (hd0)?
???? quit 退出
???? reboot 重启
4,设置开机等待时间及显示开机画面的内容
/etc/grub.conf???????????? timeout = 10

5,linux下安装windows下软件:虚拟环境??WINE


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,bdf :查看磁盘容量使用情况。 clear: 清屏?? w :分组显示用户。
2,pwd:显示当前所在上当。
3,ls:显示目录信息。
ls -a: 显示所有文件,如隐藏文件
ll:显示目录权限。 等同于 ls -l
4,cd:回到用户目录
5,rmdir:删除空目录
6,chmod:更改文件/目录存取权限
7,chgrp:更改用户组别
8,mv:移动文件或重命名文件??? (当文件同是文件或同是目录时)
9,cp:复制???? cp-i: 覆盖前询问 cp -r dir1 dri2 拷目录
10,rm:删除文件??? rm -f :强制删除
rm -r:删除目录包括子目录
rm -i:删除前询问
11,mkdir:建立系统目录
12,ps:查看进程
13,who:查看谁在线上??? who -u??????? whoami:查看当前用户身份
14,pg:以页为单位查看文件内容 pg ..|more 一行一行显示
15,grep “zxs” /etc/user
16,r:重复上一次命令
17,ln -s /u1/huapin???????? hp:创建快捷方式
18,history:最近n条记录
19,alias v= “vi? ato4d.4gl”??? unalias v 取消别名
20,通配符:? 一个 * 任意多个? []指定的一个
ls a[123] a1,a2,a3??? ls a[1-9] a1,a2,….a9
21,ls |more 分屏显示
22,排序:sort -d (字典顺序)
23,./ 当前目录? ../? 父目录下?? /? 根目录
24,mkdir -m 755 4gl???????? chmod 755 a.txt????????? r:4,w:2,e:1
25,cd:回到用户目录? cd / 回到根目录 cd – 回到上次打开目录?????? cd ~用户名??? (home下用户目录)
26,/bin (binary) 常用命令???????? /boot? 启动程序?????? /dev 设备???????? /etc 配置文件
/sbin (system binary 系统管理程序)??? /home 用户集中地??? /lib 库文件
/mnt 挂临时文件,移动设备? /proc 系统信息?????? /root? 超级用户目录??? /tmp 临时文件??? /usr 存用户应用程序的文件
27,rpm -ivh ……??? i 使用rpm安装模式 v 显示安装过程??? h 进度以#显示
rpm -* 卸载
tar cvf? … 压缩?? c 创建 v 显示信息 f 必不可少
tar xvf …? 解压

28,ls;fd?? 连续执行多条命令,用分号隔开
29,查命令所在? whereis cp
30,who, w, whoami
31,. 重复上次操作
32,find /u1/asong -name “a*” -print? 搜索
33,bath编写??
(1) 文件以#!/bin/sh开头
(2) 编写unix命令
(3) chmod 777 myshell
(4)? 运行: ./myshell
34,设置文件所有者
chown -R hp[:tpic] .wine
35,设置文件权限
chmod -R 777 .wine


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
1, vi filename 编辑或建立档案
2,vi +18 filename 开启文本到第18行
3,enter 向下一行
backspace 向左移一个字元
spacebar   向右移动一个字元
4,ctrl + F 向前滚动一个屏幕
ctrl + D 向前滚动半个屏幕
ctrl + B 向后滚动一个屏幕
ctrl + U 向后滚动半个屏幕
ctrl + E 向下一行
ctrl + Y 向上一行
5,a 在游标右方插入字元
A 在行尾游标右方插入字元
i   在游标左方插入字元
I   在行首游标左方插入字元
o  在游标下方插入一行
O 在游标上方插入一行
x  删除字元   
X  向前删除字元
dd 删除行 大:5,10d删除第5-10行
G  最后一行 21G 到第21行
/string 搜索字符串  ?string 向上     N:上一个 n:下一个 
r: 以另一字元代替游标所在字元 
R 连续修正字元,会一直处于输入模式 
q! exit 但不save          w:save                  wq: 保存退出 
nyy 复制n行 
u  撤消上次输入 
D  删除自游标起到行尾的字元 
d^ 删除自游标起到行首的字元 
dw 删除一个单词 
ndd: 删除自当前光标所在行以下的n行 
s     删除游标所在之字元,并由命令模式进入输入模式 
S  删除游标所在列,并由命令模式进行输入模式 
h 左 l 右 j 下 k 上       
J 删除下一行所有空格并提升一行。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58
煮八宝粥,将难煮的豆子和米放进普通的保温瓶中,加入开水,防置十几个小时,即可倒出用普通锅煮,煮出来的粥粘粘糯懦?


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

,拆线图

//数据,JSON
var murl = ‘data.aspx’;
var store = new Ext.data.JsonStore({
url: murl,
autoLoad:true,
root: ‘images’,
fields: [‘name’, ‘visits’, ‘views’]
});

//显示
new Ext.Panel({
iconCls:’chart’,
title: ‘ExtJS.com Visits Trend, 2007/2008 (Simple styling)’,
frame:true,
renderTo: ‘container’,
width:500,
height:300,
layout:’fit’,

items: {
??? xtype: ‘linechart’,
??? store: store,
??? url: ‘../ExtLib/resources/charts.swf’,
??? xField: ‘name’,
??? yField: ‘visits’,
??? yAxis: new Ext.chart.NumericAxis({
??????? displayName: ‘Visits’,
??????? labelRenderer : Ext.util.Format.numberRenderer(‘0,0’)
??? }),
??? tipRenderer : function(chart, record){
??????? return Ext.util.Format.number(record.data.visits, ‘0,0’) + ‘ visits in ‘ + record.data.name;
??? }
}
});


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1,引入文件:应用extjs 需要在页面中引入extjs 的样式及extjs 库文件,样式文件为resources/css/extall.css,extjs 的js 库文件主要包含两个,adapter/ext/ext-base.js 及ext-all.js,其中ext-base.js 表示框架基础库,ext-all.js 是extjs 的核心库

2, 提示框调用:Ext.Msg.alert(“提示”,”须提供订单号!”);? 需要注意的是 MessageBox 对象是异步的。不同于 JavaScript中原生的alert(它会暂停浏览器的执行),显示 MessageBox 不会中断代码的运行。由于这个原因,如果代码需要在用户对 MessageBox 做出反馈之后执行,则必须用到回调函数 Ext.Msg.alert(“提示”,”须提供订单号!”, myfunction);
Ext.Msg.show({
title:’Save Changes?’,
msg: ‘You are closing a tab that has unsaved changes. Would you like to save your changes?’,
buttons: Ext.Msg.YESNOCANCEL,
fn: processResult,? //执行完之后要调用的函数
animEl: ‘elId’,
icon: Ext.MessageBox.QUESTION
});
function processResult(){
alert(‘bbb’);
}
相应的还有:confirm,prompt

3,创建组件:
var obj={title:”hello”,width:300,height:200,html:’Hello,easyjf open source’};
var panel=new Ext.Panel(obj); panel.render(“hello”);? //hello控件的ID,将在ID为hello的控件上创建一个面板,或直接在obj内用renderTo指定。
<div id=”hello”>&nbsp;</div>

在api中找到要用的控件,用new创建,要传的参数用obj建立,里面即是api指示的属性。最后通过render输出。
如:new Ext.Button({id:”btn”,text:”myButton”}).render(“hello”);
new Ext.form.TextField({id:”btn”,value:”first”,width:200}) .render(“hello”);

4,事件
Ext.get(“btnAlert”).addListener(“click”,a);
//为ID为btnAlert的控件增加click事件 a等同于:document.getElementById(“btnAlert”).onclick=a;
延迟处理:Ext.get(“btnAlert”).on(“click”,a,this,{delay:2000});? //为btnAlert增加a方法,延迟2秒执行

5,面板
面板由以下几个部分组成,一个顶部工具栏、一个底部工具栏、面板头部、面板尾部、面板主区域几个部分组件。

6,窗口
var i=0;
function newWin()
{
var win=new Ext.Window({title:”窗口”+i++,
width:400,
height:300,
maximizable:true});
win.show();
}
Ext.onReady(function(){
Ext.get(“btn”).on(“click”,newWin);
});

7,布局
ExtJS 的容器组件包含一个layout 及layoutConfig 配置属性,这两个属性用来指定容器使用的布局及布局的详细配置信息,如果没有指定容器组件的layout 则默认会使用ContainerLayout 作为布局,该布局只是简单的把元素放到容器中,,常用的布局有border、column、fit、form、card、tabel等布局。
使用方式:指定布局方式,指定位置(可选)
Ext.onReady(function(){
new Ext.Panel({
renderTo:”hello”,
width:400,
height:200,
layout:”column”,
items:[{columnWidth:.5,
title:”面板1″},
{columnWidth:.5,
title:”面板2″}
]
});
注:items:传入的单独一个项,应直接传入一个对象的引用( 如items: {…})。多个项应以数组的类型传入(如items: [{…}, {…}])。
如:items:[
{fieldLabel:”请输入姓名”,name:”name”,xtype:”button”,text:”hello”},
//用xtype指定使用的控件,控件类型为Ext.Componentxtype
{fieldLabel:”请输入地址”,name:”address”}] //默认为textbox

1)Column布局:layout:”column” 在items中用ColumnWidth指定占据的宽度即可
2)Border区域布局 。该布局把容器分成东南西北中五个区域,分别由east,south, west,north, cente来表示
layout:”Border” 在items中用region:”east” 指定位置。
3)fit布局:自动用子填充父容器,以第一个子为主,其它加上也是无用。
4) Form 布局是一种专门用于管理表单中输入字段的布局,这种布局主要用于在程序中创建表单字段或表单元素等使用,在实际应用中,Ext.form.FormPanel 这个类默认布局使用的是Form 布局,而且FormPanel还会创建与<form> 标签相关的组件,因此一般情况下我们直接使用FormPanel 即可。
new Ext.form.FormPanel({
renderTo:”hello”,? //指定输出
title:”容器组件”,
width:300,
labelAlign:”right”,
height:120,
defaultType: ‘textfield’,
items:[
{fieldLabel:”请输入姓名”,name:”name”},
{fieldLabel:”请输入地址”,name:”address”},
{fieldLabel:”请输入电话”,name:”tel”}
] }
);
});
5)Accordion 布局由类Ext.layout.Accordion 定义,名称为accordion,表示可折叠的布局,也就是说使用该布局的容器组件中的子元素是可折叠的形式,有个动态的上下卷动效果。在窗口属性 layoutConfig 中指定布局配置参数animate 为true,表示在执行展开折叠时是否应
用动画效果。
6)Table 布局,该布局负责把容器中的子元素按照类似普通html 标签排列
Ext.onReady(function(){
var panel=new Ext.Panel({
renderTo:”hello”,
title:”容器组件”,
width:500,
height:200,
layout:”table”,
layoutConfig: {
columns: 3?? //指定列数
},
items:[{title:”子元素1″,html:”这是子元素1中的内容”,rowspan:2,height:100}, //指定每个占用的td
{title:”子元素2″,html:”这是子元素2中的内容”,colspan:2},
{title:”子元素3″,html:”这是子元素3中的内容”},
{title:”子元素4″,html:”这是子元素4中的内容”}
] }
);
});

8,表格控件:表格由类Ext.grid.GridPanel 定义,继承自Panel,其xtype 为grid。ExtJS 中,表格Grid必须包含列定义信息, 并指定表格的数据存储器Store 。表格的列信息由类Ext.grid.ColumnModel 定义、而表格的数据存储器由Ext.data.Store 定义,数据存储器根据解
析的数据不同分为JsonStore、SimpleStroe、GroupingStore 等。
1),显示数据,故要指定数据,在属性中有一store,用来指定数据,此外还有有列名,列名用cm定义
Ext.onReady(function(){
//指定数据
var data=[ [1, ‘EasyJWeb’, ‘EasyJF’,’www.easyjf.com’],
[2, ‘jfox’, ‘huihoo’,’www.huihoo.org’],
[3, ‘jdon’, ‘jdon’,’www.jdon.com’],
[4, ‘springside’, ‘springside’,’www.springside.org.cn’] ];
var store=new Ext.data.SimpleStore({data:data,fields:[“id”,”name”,”organization”,”homepage”]});

//指定列名
var colM=new Ext.grid.ColumnModel([{header:”项目名称”,dataIndex:”name”,sortable:true},
{header:”开发团队”,dataIndex:”organization”,sortable:true},
{header:”网址”,dataIndex:”homepage”}]);

//创建
var grid = new Ext.grid.GridPanel({
renderTo:”hello”,
title:”中国Java开源产品及团队”,
height:200,
width:600,
cm:colM,
store:store,
autoExpandColumn:2
});
});

9,可编辑表格控件EditorGridPanel,可编辑表格是指可以直接在表格的单元格对表格的数据进行编辑,ExtJS 中的可编辑表格由
类Ext.grid.EditorGridPanel 表示,xtype 为editorgrid。使用EditorGridPanel 与使用普通的GridPanel 方式一样,区别只是在定义列信息的时候,可以指定某一列使用的编辑即可。
var colM=new Ext.grid.ColumnModel([{
header:”姓名”,
dataIndex:”name”,
sortable:true,
editor:new Ext.form.TextField()},
{header:”性别”,
dataIndex:”sex”
},
。当对一个单元格进行编辑完之后,就会触发afteredit 事件,可以通过该事件处理函数来处理单元格的信息编辑,把编辑后的数据保存到服务器。

10,数据存储Stroe
1),record ,一个Record 可以理解为关系数据表中的一行,也可以称为记录。Record 对象中即包含了记录(行中各列)的定义信息(也就是该记录包含哪些字段,每一个字段的数据类型等),同时又包含了记录具体的数据信息(也就是各个字段的值)。
Ext.onReady(function(){
var MyRecord = Ext.data.Record.create([?? //指定列
{name: ‘title’},
{name: ‘username’, mapping: ‘author’},
{name: ‘loginTimes’, type: ‘int’},
{name: ‘lastLoginTime’, mapping: ‘loginTime’, type: ‘date’}
]);
var r=new MyRecord({?? //赋值
title:”日志标题”,
username:”easyjf”,
loginTimes:100,
loginTime:new Date()
});
alert(MyRecord.getField(“username”).mapping);
alert(MyRecord.getField(“lastLoginTime”).type);
alert(r.data.username);
alert(r.get(“loginTimes”));
});
2) store:一个Store 包含多个Record,同时Store 又包含了数据来源,数据解析器等相关信息,Store 通过调用具体的数据解析器(DataReader)来解析指定类型或格式的数据(DataProxy),并转换成记录集的形式保存在Store 中,作为其它控件的数据输入。
数据存储器由Ext.data.Store 类定义,一个完整的数据存储器要知道数据源(DataProxy)及数据解析方式(DataReader)才能工作
DataReader:
ArrayReader Ext.data.ArrayReader-数组解析器,用于读取二维数组中的信息,并转换成记录集Record对象
JsonReader? Ext.data.JsonReader-Json 数据解析器,用于读取JSON 格式的数据信息,并转换成记录集Record 对象
XmlReader??? Ext.data.XmlReader-XML 文档数据解析器,用于把XML 文档数据转换成记录集Record对象
DataProxy: DataProxy 字面解释就是数据代理,也可以理解为数据源,也即从哪儿或如何得到需要交给DataReader 解析的数据。

11 、TreePanel
Ext.onReady(function(){
var root=new Ext.tree.TreeNode({
id:”root”,
text:”树的根”});

root.appendChild(new Ext.tree.TreeNode({
id:”c1″,
text:”子节点1″
}));

var tree=new Ext.tree.TreePanel({
renderTo:”hello”,
root:root,
width:100? //可用loader: new Ext.tree.TreeLoader({url:”treedata.js”}), 来动态加载数据,此时root要用AsyncTreeNode类型
});
});


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1, EXTJS:UI全部帮你搞定,不用费劲去弄样式! 浏览器兼容性好,在各各浏览器下测试都OK! 和后台代码无关,不管后面用C#也好 JAVA也好 还是PHP 都和它没关系。 动画效果,EXTJS的动画效果做得很不错,提高了用户的感知度。
缺点: 开发周期延长(要先学习才能灵活使用)
2,ExtJS是一个Ajax框架,是一个用javascript写的,用于在客户端创建丰富多彩的web应用程序界面。


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

session是用户信息的共享区域,在一个类中放数据到session中时,意味着这些数据要让多个页面共享,那么在命名的时候一定要特殊,
避免变量名相同,造成数据重叠!


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

若允许用户在没有权限的情况下可以看到后台的页面,则可通过分析后台页面文件来生成新用户,进而进入后台。
如:一后台页面可以看到,当然不能操作。找到其增加用户的页面,选择好数据,在地址栏中进行插入:
http://www.telishou.com/manage/admin/insert.action?admin.name=123&password=123&power=管理员
完成用户的增添。即使权限不在插入页面中设置,可找到update页面也利用地址栏方式修改。
地址栏传参方式可避开页面中设置的验证条件,向数据库中插入一些非法的数据。

向数据库中插入一些非法的数据对应方法:
?????????????????????????????????? 1,禁止没有权限的用户得到权限页面文件,对insert,update,delete,select操作加上必要的身份识别:没有权限?? 者不可执行操作。
?????????????????????????????????? 2,验证要在服务器上进行,而不是在客户前端通过js验证。