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

namespace=”/news”? “/news”是在地址栏中显示的路径,而非目录 如:http://pc-officea3:8080/news/index.action?
在jsp中用index.action 相当于 /news/index.action 要结合地址栏中名称空间来找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

1, 美体学堂 在链接中执行action,根据action转到指定的页面
这样传的只是admin.id,即使此链接在一个form内,也不会传form内的数据
若想传form内的数据,那么唯一的方法就是让form提交
即: 删除

ps: form传参


这样提交时数据传的是form包裹的数据,在form外的是不会被提交的。

2,

若用 /manage/news/insert.action 且在tomcat 中path=“/” 则为绝对路径,否则代表当前目录下的manage文件夹下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

菜单
Project -> Build Automatically
Myeclipse中Tomcat的两种部署方式
一、在Myeclipse软件中部署

1、 在Myeclipse中,创建好工程后,在Myeclipse菜单栏中选择 Windows -> Preferences -> Myeclipse -> Tomcat5,选择”Enable”;Tomact Home Directory要选择你机器上Tomcat所安装的目录。然后,再Windows -> Preferences -> Myeclipse -> Tomcat5 ->JDK,确保这个是有对应的jdk版本,若没有,则通过”Add”添加其安装路径。ok

2、选择工具栏上的按钮,在”Project”中选择你要部署的工程,然后”Add”,再选择”Tomcat”,Finish。

3、 在工具栏上选择,启动Tomcat。

4、 运行程序。在IE中输入http://localhost:8080/aa/WebRoot/index.jsp(aa为工程名字)
二、在Tomcat的server.xml配置文件中部署

1、在Tomcat下,找到conf文件下的server.xml,打开。

2、在<Host>和</host>之间加上如下代码:

1
2 <Context path=”/虚拟目录名” docBase=”目标目录位置” debug=”0″ reloadable=”true” >
3 </Context>

(严格区分大小写,当path=””时,此时的虚拟目录直接为root—>http://localhost:8080/)
参数:

?path:表示在浏览器中输入http://localhost:8080/虚拟目录名

如:path=”/aa” 则浏览器中输入http://localhost:8080/aa/index.jsp

? path 就是提供一个前缀功能。
?docBase:表示你的程序包的物理绝对路径,默认的绝对路径是???? %tomcat_home%/webapps

workDir:?? 表示是缓存文件的放置地点,可以方便跨平台移植时不用重编译。这样,你的应用程序就可以放到硬盘上的任意地方了,临时文件的存放地点不设置的话,默认存放在tomcat\work\Catalina\\localhost之下\localhost

?reloadable :为true,则tomcat会自动检测应用程序的/WEB-INF/lib 和/WEB-INF/classes目录的变化,自动装载新的应用程序,我们可以在不重起tomcat的情况下改变应用程序;为false则不自动加载。

如:
<Context path=”/” reloadable=”true” docBase=”E:\workspace\.metadata\.plugins\com.genuitec.eclipse.easie.tomcat.myeclipse\tomcat\webapps\testAuto”
workDir=”E:\workspace\.metadata\.plugins\com.genuitec.eclipse.easie.tomcat.myeclipse\tomcat\webapps\testAuto” />

在地址栏中输入:? http://localhost:8080/index.jsp 即可运行 ,不用再加上工程名如: http://localhost:8080/myproject/index.jsp??? </Host>
reloadable=”true”会自动更新classes, jsp文件??? ps: docBase要精确到工程名才可
用myeclipse 更改类文件时,其会自动编译,而tomcat就会自动更新classes文件,

问题:IE中没有显示变化结果,原因:myeclipse自动编译还未完成,在部分是很快的。
默认为false, 只会自动更新jsp文件

ps:路径要与path设置的路径相同才可看到自动发生的变化


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, 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


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

?将html元素值恢复成默认值,如 <input type=”text” value = “${news.title}”>之类。 若此文本框接收的是Action传来的值作为默认值,修改后,按下reset就会恢复成此默认值,而不是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

?须将表中所有的字段在jsp页面中接收,不想显示出来的就将其放入<input type=”hidden” value=”表字段”>
这样在提交时,更新Action的实体类,不会因未接收一个字段,使得此字段在实体类中为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,在Action中:(ServletActionContext.getRequest().setAttribute
?????? 注:在配置action转发类型时要为dispatcher,不能为redirect, 因redirect忽略request的参数!
?2, 在页面中:${news.title}
?
forward 与 redirect 区别:

1.从地址栏显示来说
forward 地址栏还是原来的地址.
redirect 地址栏显示的是新的URL

2.从数据共享来说
forward:? 转发页面和转发到的页面可以共享request,session里面的数据.
redirect: 转发页面和转发到的页面不可以共享request里面的数据,但可以共享
session里面的数据.

3.应用
forward 是服务器内部的一种操作,只能在同一个Web应用程序内的资源之间转发
请求.
redirect 是服务器通知客户端,让客户端重新发起请求,不仅可以重定向到当前
应用程序的其他资源,还可以重定向到同一个站点上的其他应用程序中的资源,
甚至是使用绝对URL重定向到其他站点的资源.

4.从效率来说
forward:高.
redirect:低.

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容
读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从
哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,(不会传request,故其不能共用
request中的数据)告诉浏览器重新去请求那个地址.所以地址栏显示的是新的
URL.所以redirect等于客户端向服务器端发出两次request,同时也接受两次
response。


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中只要定义一个变量,及set,get方法,那么当页面传来数据,变量名相同时就会调用Action的set方法进行赋值
在页面中接收Action数据时,会将Action的数据自动存入到request中,只要没设置type=”redirect”,那么在页面中直接用${userName}就会自动得到数据。

页面 ————request ———Action ————request —————页面


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, Action中传送

方式(1) Collection actionMessage = new ArrayList ();
actionMessage.add(“输入有误!”);
setActionMessages(actionMessage);

方式(2)addActionMessage(“输入有误!”)

2,Struts.xml 中配置

success.jsp
/error.jsp

3,页面接收

注意:

如果将result标签的type属性设置为redirect则在Action即使使用了

addActionMessage(“输入有误!”);
setActionMessages(actionMessage);

在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

1,WEB执行流程:发送jsp页面请求,Servlet接收,读取web.xml文件 ,据传来的路径转到对应的Servlet,进行操作
Servlet向jsp页面输出,会得到执行的是文字,图片之类而form指定的action因还没有submit,故此时不会得到执行
因图片是要读取加载的,故可在其中令其执行action
如:
即:页面显示时执行action

2,在Web.xml中配置:

index.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

相同的部分:
客户端发送jsp页面请求,Servlet接收,读取web.xml文件 ,据传来的路径转到对应的Servlet,进行操作,
不同在于操作时方法名是否固定,是否须extends框架提供的类
servlet要自定义接收参数,getParameter, 手动设置响应返回,
PrintWriter out = response.getWriter();
out.print( “

” );
而struts接收数据已由框架本身完成接受,而转到某一页面则可指定,不是手动再创建。

在web.xml三种框架的配置比较

ps: 任意指定,如可以都为*.action

1, Servlet

AutoServlet

com.servlet.AutoServlet



AutoServlet
/AutoServlet

AutoServlet extends HttpServlet,实现其get,post方法
当jsp路径为/AutoServlet时执行get方法,
可看出:所有的操作类都要在web.xml中配置,不能集上管理这些servlet,而Struts分别提供了struts-config.xml,struts.xml集中管理操作类的文件

执行的方法固定,get,set

2,Struts1.x

action
org.apache.struts.action.ActionServlet
config /WEB-INF/struts-config.xml


action
*.do

当页面传来*.do时执行action,这是Struts系统提供的Servlet,它会读取中所配置的
/WEB-INF/struts-config.xml文件,进一步找到具体的action进行操作。

action 方法名为execute, 若其它任意,不过必须继承Struts1.x提供的action类

3,Struts2.0

struts2

org.apache.struts2.dispatcher.FilterDispatcher



struts2
*.action

当页面传来*.action时执行FilterDispatcher,它会读取/src/struts.xml的文件,从而执行对应的类
action方法名任意,类继承谁没有限制,也就是说任何类都可以成为一个Struts1.x中的action

框架名称 是否继承特定类 方法名 集中管理action类文件

servlet 是,HttpServlet get, post 无, 一切都在web.xml中配置

struts1.x 是,Action,DispatchAction execute, 任意 有,struts-config.xml

struts2.0 任意 任意 有,struts.xml

struts1.x struts2.0 细节区别:

(1), 类形式:struts2.0的action 类似于struts1.x中的DispatchAction 不过前者类随意继承,没有限制,而后者强制要继承自Dispath才可执行.
(2), 运行: struts2.0的action可直接在 地址栏中用 http://pc-officea3:8080/testWeb/index.action.执行测试,而struts1.x必须要有jsp页面才可
(3), 测试:struts1.xservlet API execute方法I execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)暴露了servlet AP,在测试时须在jsp页面中提交,生成request才可进行, 而struts2.0 方法名是任意的,不限制的如insert()无形参,可直接用JUNITT等生成对象,用 myobject.set来给值,此步相当于jsp页面提交,最大的好处是不用转到jsp页面,生成request才能得到执行,因struts2.0 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

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>