strtus1 html5,struts1.x的入门级学习教程

在培训是辅导给我们将的一个struts1的串讲,最近在修改一个项目,在系统项目中使用的是struts1.3,俗话说"临阵磨枪,不快也光"吗?现在给自己一个时间来再次回顾一下。

一、下载struts1.x

在Apache官网上找到struts的主页,找到struts的下载页面,现在的最新版本是struts-2.0.14-all.zip.将struts1.x下载下来。

二、了解struts1.3x构成

1.struts运行需要的包commons-digester.jar

用于解析配置文件

commons-fileupload.jar

用于实现文件上传

commons-logging.jar

用于日志处理

commons-beanutils.jar

用于pojo的属性赋值

commons-validator.jar

用于表单验证jar包.

2、struts标记库文件(tld)

(1)struts-bean.tld

(2)struts-html.tld

(3)struts-logic.tld

(4)struts-nested.tld

(5)struts-tiles.tld

3、配置文件Struts-config.xml

1

4f1150b881333f12a311ae9ef34da474.png<?xml  version="1.0" encoding="UTF-8"?>24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.pngstruts-config PUBLIC44f1150b881333f12a311ae9ef34da474.png          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"54f1150b881333f12a311ae9ef34da474.png          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">64f1150b881333f12a311ae9ef34da474.png74f1150b881333f12a311ae9ef34da474.png84f1150b881333f12a311ae9ef34da474.png94f1150b881333f12a311ae9ef34da474.png104f1150b881333f12a311ae9ef34da474.png114f1150b881333f12a311ae9ef34da474.png124f1150b881333f12a311ae9ef34da474.png134f1150b881333f12a311ae9ef34da474.png144f1150b881333f12a311ae9ef34da474.png154f1150b881333f12a311ae9ef34da474.png164f1150b881333f12a311ae9ef34da474.png174f1150b881333f12a311ae9ef34da474.png184f1150b881333f12a311ae9ef34da474.png194f1150b881333f12a311ae9ef34da474.png204f1150b881333f12a311ae9ef34da474.png214f1150b881333f12a311ae9ef34da474.png

4、资源文件 (代码测试)

使用资源文件的步骤:

(1)确认资源文件的jar导入

(2)引入标记库

三、struts1.3x核心控制流程

1。主要组件

.ActionServlet组件:充当struts框架的中央控制器。

.RequestProcessor组件:充当每个子应用模块的请求处理器

.Action组件:负责处理一项具体的业务。

2。ActionServlet

(1)Struts的启动通常从加载ActionServlet开始(如果没有其他Servlet的加载优先级比它高)。ActionServlet在应用一加载时即会被实例化并调用其init方法。

(2)init方法所做的主要工作有:

1)加载struts配置文件,并创建用于封装配置信息的ModuleConfig对象

2)加载资源文件,并创建用于封装资源文件的MessageResources对象。

另外,如果有相应配置的话,init方法还将初始化数据源和PlugIn

注意:

1)如果web.xml有多模块配置,将创建多个ModuleConfig对象和MessageResources对象分别用于封装各个模块的struts配置文件和资源文件。

eg.多模块

1

4f1150b881333f12a311ae9ef34da474.png24f1150b881333f12a311ae9ef34da474.pngconfig34f1150b881333f12a311ae9ef34da474.png/WEB-INF/struts-config.xml44f1150b881333f12a311ae9ef34da474.png54f1150b881333f12a311ae9ef34da474.png64f1150b881333f12a311ae9ef34da474.png74f1150b881333f12a311ae9ef34da474.pngconfig/ma84f1150b881333f12a311ae9ef34da474.png/WEB-INF/ma/struts-config.xml94f1150b881333f12a311ae9ef34da474.png104f1150b881333f12a311ae9ef34da474.png114f1150b881333f12a311ae9ef34da474.pngconfig/mb124f1150b881333f12a311ae9ef34da474.png/WEB-INF/mb/struts-config.xml134f1150b881333f12a311ae9ef34da474.png144f1150b881333f12a311ae9ef34da474.png    或者154f1150b881333f12a311ae9ef34da474.png164f1150b881333f12a311ae9ef34da474.pngconfig174f1150b881333f12a311ae9ef34da474.png/WEB-INF/struts-config.xml184f1150b881333f12a311ae9ef34da474.png194f1150b881333f12a311ae9ef34da474.png204f1150b881333f12a311ae9ef34da474.pngconfig/catalog214f1150b881333f12a311ae9ef34da474.png/WEB-INF/ma-struts-config.xml224f1150b881333f12a311ae9ef34da474.png234f1150b881333f12a311ae9ef34da474.png244f1150b881333f12a311ae9ef34da474.pngconfig/authorize254f1150b881333f12a311ae9ef34da474.png/WEB-INF/mb-struts-config.xml264f1150b881333f12a311ae9ef34da474.png274f1150b881333f12a311ae9ef34da474.png

2)针对各个模块所创建的ModuleConfig对象和MessageResources对象将存储在ServletContext中,对应的属性名中有该模块名称的相应标识。

(3)ActionServlet的process()方法的主要工作有:

1)根据请求信息获知所请求的模块名称,从ServletContext中获得与请求模块对应的的

ModuleConfig对象,并存储到request中。

2)根据模块信息获得相应的RequestProcessor对象,一个模块对应一个RequestProcessor

对象,RequestProcessor对象将关联与所属模块对应的ModuleConfig对象。

3)调用RequestProcessor对象的process方法,将request和response作为参数传递给它。3、RequestProcessor类

(1)Struts框架只允许应用中存在一个ActionServlet类,但每个应用程序模块都有各自的RequestProcessor类实例。

(2)RequestProcessor对象的process方法的主要工作:

1)调用自己的processPreprocess(request, response)方法,该方法不进行任何操作,用于

子类重写扩展其功能。

2)获得与请求地址所匹配的ActionMapping对象,AcionMapping对象用于封装一个特

定acion的配置信息。

3)根据ActionMapping中的配置信息获得ActionForm对象(该对象将缓存到request

或session中),并将表单数据填充到ActionForm中,然后根据ActionMapping的配置决

定是否验证ActionForm,如果验证,将调用ActionForm的validate方法,若其返回的

ActionErros对象中包含ActionMessage对象则表示验证失败,将转向action配置信息input

属性所指示的地址。

4)如果ActionForm无需验证或验证通过将创建并缓存与请求地址匹配的Action对象,

将ActionMapping对象、ActionForm对象、request和response作为参数调用其execute

方法。

5)根据Action对象的execute方法返回的ActionForward对象,将请求转发或重定向到

该ActionForward所封装的地址。

4、Action类

(1)Action类是用户请求和业务逻辑之间的桥梁

(2)ActionServlet对所有的请求作集中的统一处理,每个不同的Action类具体处理不同的请求。

(3)每个Action类都需要实现execute()方法,RequestProcessor类创建一个Action实例后,就会调用其execute()方法。

(4)struts-config.xml:

1

4f1150b881333f12a311ae9ef34da474.png24f1150b881333f12a311ae9ef34da474.pngtype=”Action类的名称(包名.类名)”44f1150b881333f12a311ae9ef34da474.pngname=”该Action关联的ActionForm的名称”54f1150b881333f12a311ae9ef34da474.png84f1150b881333f12a311ae9ef34da474.pngattribute=” 缓存ActionForm对象的名称(key),不写key就是name的值”94f1150b881333f12a311ae9ef34da474.pngscope=” 缓存ActionForm的范围(request|session)默认是session”104f1150b881333f12a311ae9ef34da474.pngvalidate=”是否要验证true|false”114f1150b881333f12a311ae9ef34da474.png144f1150b881333f12a311ae9ef34da474.pnginput=”” 和validate=”true” 联用,表示验证失败后,FC把请求转向的地址154f1150b881333f12a311ae9ef34da474.pngparameter=”” 是一个附加的属性,对于不同的Action可能有不同的意义164f1150b881333f12a311ae9ef34da474.png174f1150b881333f12a311ae9ef34da474.pngpath=””地址必须以“/”开头 redirect=””表示是否重定向/>194f1150b881333f12a311ae9ef34da474.png… … …204f1150b881333f12a311ae9ef34da474.png214f1150b881333f12a311ae9ef34da474.png224f1150b881333f12a311ae9ef34da474.png

5、内置的Struts Action类

(1)目的

1)减少Action类的数目

2)便于代码的维护

(2)DispatchAction

1)特点:

①DispatchAction类是Action类的子类;

②共享同一个Action的路径;

③共享一个ActionForm,多个不同action path,可以在同一个类中。

2)DispatchAction的写法:

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassMyDispatchActionextendsDispatchAction9b8a8a44dd1c74ae49c20a7cd451974e.png{2d18c02628675d0a2c816449d98bda930.png3d18c02628675d0a2c816449d98bda930.pngActionForward login(ActionForm form,HttpServletRequest request,4d18c02628675d0a2c816449d98bda930.png597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifHttpServletResponse response,ActionMapping mapping)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{6d18c02628675d0a2c816449d98bda930.png7d18c02628675d0a2c816449d98bda930.pngreturnmapping.findForward(“sucess”);8d18c02628675d0a2c816449d98bda930.png9ecedf933ec37d714bd4c2545da43add2.png}10d18c02628675d0a2c816449d98bda930.png118f1ba5b45633e9678d1db480c16cae3f.png}124f1150b881333f12a311ae9ef34da474.png134f1150b881333f12a311ae9ef34da474.png注意:不要覆盖execute()方法

3)DispatchAction的配置文件:

1

4f1150b881333f12a311ae9ef34da474.png24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.png44f1150b881333f12a311ae9ef34da474.png54f1150b881333f12a311ae9ef34da474.png64f1150b881333f12a311ae9ef34da474.png

注意:parameter属性是和表单中隐藏域的名字相对应的

4)DispatchAction页面:

Login

(3)MappingDispatchAction

1)特点:

①MappingDispatchAction类是DispatchAction的子类

②可以匹配多个action路径

③可以不共享同一个ActionForm

2)MappingDispatchAction的写法

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassMyMappingDispatchActionextendsMappingDispatchAction9b8a8a44dd1c74ae49c20a7cd451974e.png{2d18c02628675d0a2c816449d98bda930.png3d18c02628675d0a2c816449d98bda930.pngActionForward login(ActionForm form,HttpServletRequest request,4d18c02628675d0a2c816449d98bda930.png597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifHttpServletResponse response,ActionMapping mapping)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{6d18c02628675d0a2c816449d98bda930.png7d18c02628675d0a2c816449d98bda930.pngreturnmapping.findForward(“success")8d18c02628675d0a2c816449d98bda930.png9ecedf933ec37d714bd4c2545da43add2.png}10d18c02628675d0a2c816449d98bda930.png118f1ba5b45633e9678d1db480c16cae3f.png}124f1150b881333f12a311ae9ef34da474.png134f1150b881333f12a311ae9ef34da474.png

3)MappingDispatchAction的配置文件

parameter=“login">

注意:parameter属性是指定调用方法的名字

4)MappingDispatchAction页面

注意:在JSP页面中不需要再使用隐藏域来传递参数了,在form中的action就可以

直接使用xxx.do匹配了。

(4)LookupDispatchAction

1)特点:

①LookupDispatchAction类也是DispatchAction类的子类。

②解决一个表单的多个同名提交按钮的问题。

③通过使用资源文件,用submit按钮的value来作为资源文件中的key所对应的值,通

过这个值来找到对应的key,再使用这个key来获得指定Map中所对应的值,这个值就

是要调用的方法名。

注意:在继承LookupDispatchAction时,要覆盖getKeyMethodMap()方法,并定义Map,

向Map中放入指定的键值对。

2)LookupDispatchAction的写法

1

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclassTestLookupDispatchActionextendsLookupDispatchAction9b8a8a44dd1c74ae49c20a7cd451974e.png{2d18c02628675d0a2c816449d98bda930.png3d18c02628675d0a2c816449d98bda930.pngpublicActionForward login(ActionMapping mapping, ActionForm form,4d18c02628675d0a2c816449d98bda930.png597e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        HttpServletRequest request, HttpServletResponse response)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{6d18c02628675d0a2c816449d98bda930.png7d18c02628675d0a2c816449d98bda930.pngreturnmapping.findForward("success");8d18c02628675d0a2c816449d98bda930.png9ecedf933ec37d714bd4c2545da43add2.png   }10d18c02628675d0a2c816449d98bda930.png11d18c02628675d0a2c816449d98bda930.pngpublicActionForward register(ActionMapping mapping, ActionForm form,12d18c02628675d0a2c816449d98bda930.png1397e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif                 HttpServletRequest request, HttpServletResponse response)throwsException9b8a8a44dd1c74ae49c20a7cd451974e.png{14d18c02628675d0a2c816449d98bda930.png15d18c02628675d0a2c816449d98bda930.pngreturnmapping.findForward("register");16d18c02628675d0a2c816449d98bda930.png17ecedf933ec37d714bd4c2545da43add2.png      }18d18c02628675d0a2c816449d98bda930.png1997e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicMap getKeyMethodMap()9b8a8a44dd1c74ae49c20a7cd451974e.png{20d18c02628675d0a2c816449d98bda930.png21d18c02628675d0a2c816449d98bda930.png           Map map=newHashMap();22d18c02628675d0a2c816449d98bda930.png23d18c02628675d0a2c816449d98bda930.png//key 为资源文件的key 值,value 为action 中的方法名。24d18c02628675d0a2c816449d98bda930.png25d18c02628675d0a2c816449d98bda930.png           map.put("submit.login","login");26d18c02628675d0a2c816449d98bda930.png27d18c02628675d0a2c816449d98bda930.png           map.put("submit.register","register");28d18c02628675d0a2c816449d98bda930.png29d18c02628675d0a2c816449d98bda930.pngreturnmap;30d18c02628675d0a2c816449d98bda930.png31ecedf933ec37d714bd4c2545da43add2.png      }32d18c02628675d0a2c816449d98bda930.png338f1ba5b45633e9678d1db480c16cae3f.png}344f1150b881333f12a311ae9ef34da474.png354f1150b881333f12a311ae9ef34da474.png

3)LookupDispatchAction资源文件

MessageResource.properties文件中

submit.login=login

submit.register=register

4)LookupDispatchAction的配置文件:

1

4f1150b881333f12a311ae9ef34da474.png24f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.png44f1150b881333f12a311ae9ef34da474.png54f1150b881333f12a311ae9ef34da474.png64f1150b881333f12a311ae9ef34da474.png74f1150b881333f12a311ae9ef34da474.png84f1150b881333f12a311ae9ef34da474.png94f1150b881333f12a311ae9ef34da474.png114f1150b881333f12a311ae9ef34da474.pngtype="action.TestLookupDispatchAction"parameter="submit">124f1150b881333f12a311ae9ef34da474.png134f1150b881333f12a311ae9ef34da474.png144f1150b881333f12a311ae9ef34da474.png154f1150b881333f12a311ae9ef34da474.png164f1150b881333f12a311ae9ef34da474.png174f1150b881333f12a311ae9ef34da474.png184f1150b881333f12a311ae9ef34da474.png194f1150b881333f12a311ae9ef34da474.png204f1150b881333f12a311ae9ef34da474.png214f1150b881333f12a311ae9ef34da474.png224f1150b881333f12a311ae9ef34da474.png234f1150b881333f12a311ae9ef34da474.png

5)LookupDispatchAction页面:

1

4f1150b881333f12a311ae9ef34da474.png34f1150b881333f12a311ae9ef34da474.pngstyleClass="lookupForm">44f1150b881333f12a311ae9ef34da474.png54f1150b881333f12a311ae9ef34da474.png                  userName:
64f1150b881333f12a311ae9ef34da474.png74f1150b881333f12a311ae9ef34da474.png                  password:84f1150b881333f12a311ae9ef34da474.png94f1150b881333f12a311ae9ef34da474.png
104f1150b881333f12a311ae9ef34da474.png114f1150b881333f12a311ae9ef34da474.png124f1150b881333f12a311ae9ef34da474.png134f1150b881333f12a311ae9ef34da474.png144f1150b881333f12a311ae9ef34da474.png154f1150b881333f12a311ae9ef34da474.png164f1150b881333f12a311ae9ef34da474.png174f1150b881333f12a311ae9ef34da474.png184f1150b881333f12a311ae9ef34da474.png194f1150b881333f12a311ae9ef34da474.png204f1150b881333f12a311ae9ef34da474.png214f1150b881333f12a311ae9ef34da474.png224f1150b881333f12a311ae9ef34da474.png234f1150b881333f12a311ae9ef34da474.png244f1150b881333f12a311ae9ef34da474.png254f1150b881333f12a311ae9ef34da474.png

注意:页面中的property="submit"与struts-config.xml中action的parameter元素值相同

四、ActionForm

1、为什么使用form?

(1)用户提交的数据封装成对象

(2)表单数据的缓存。

(3)表单信息验证(服务器端验证)

2、ActionForm的生命周期

(1)ActionForm Bean有两种存在范围:request和session

1)如果存在于request范围,它仅在当前的请求/响应生命周期中有效

2)如果存在于session范围,同一个ActionForm实例在整个Http会话中有效

注意:在struts配置文件中,元素的scope属性用来设置ActionForm的范围,

默认值为session。

3、配置ActionForm

(1)action和form的关系是:一对多

(2)struts-config.xml

… … …

(3)在某一个Action的配置中可以写:

4、Form验证

(1)验证:

1)表单级验证:(不访问数据库)

①JavaScript做的是客户端验证,可以减少服务器端的负担,但不够安全

②在服务器端的Form验证避免跳过客户端的校验

2)业务逻辑验证:

由Action负责完成

(2)validator()方法

1)调用的条件:

①Form继承ActionForm,并且为ActionForm配置了Action映射,即元素的name属性和元素的name属性匹配。

②元素的validate属性为true

2)validate()方法

该方法返回ActionErrors对象,如果返回的ActionErrors对象为null,或者

不包含任何ActionMessage对象,就表示没有错误,数据验证通过。如果ActionErrors中包含ActionMessage对象,就表示发生了验证错误。

3)validate()方法主要负责检查数据的格式和语法,而不负责数据是否符合业务逻辑。

(3)Validator框架(验证框架)

1)validate()方法验证的局限性:

①必须通过程序代码来实现验证逻辑,如果验证逻辑发生变化,必须重新编写和编译

程序代码

②当系统中有多个ActionForm Bean,并且它们包含一些相同的验证逻辑时,开发人员必须对每个ActionForm Bean进行重复编程,完成相同的验证逻辑,这会降低代码的可重用性。

2)主要依赖的jar文件:

①jakart-oro.jar:提供了一组处理文本的类,具有文本替换、过滤和分割等功能

②commons-validator.jar:提供了一个简单、可扩展的验证框架,包含了通用的验证方

法和验证规则。

3)条件:

①validator-rules.xml validation.xml

②struts-config.xml写plug-in

value="/WEB-INF/validator-rules.xml,

/WEB-INF/validation.xml"/>

③Form必须继承ValidatorForm(ActionForm子类)

4)validator-rules.xml中规定了常见的验证需求。一般不需要改变。

5)validation.xml是form验证的配置文件。

切记:Validator框架不能用于验证标准的ActionForm类。如果要使用Validator框架,

应该采用ActionForm类的两个子类:DynaValidatorForm(支持动态ActionForm)和ValidatorForm(支持标准ActionForm)。

5、动态ActionForm

(1)ActionForm的缺点:表单的改动会触发FormBean的大量改动(应用程序停器,而且

FromBean维护量大)。

(2)动态FormBean是指,Struts已提供给我们DynaActionForm(是ActionForm的子类),我们只需通过配置文件进行配置。

(3)DynaActionForm的写法:

①struts-config.xml

type="org.apache.struts.action.DynaActionForm">

注意:Type表示属性类型,注意若为基本类型时要用其包装类。

type="action.TestDynaActionFormAction" scope="request">

path="/jsp/testDynaActionForm_success.jsp">

②TestDynaActionForm.jsp

测试DynaActionForm


姓名:

年龄:

③TestDynaActionFormAction.java

public class TestDynaActionFormAction extends Action {

@Override

public ActionForward execute(ActionMapping mapping,

ActionForm form,HttpServletRequest request,

HttpServletResponse response) throws Exception {

DynaActionForm daf = (DynaActionForm) form;

String name = (String)daf.get("name");    //取daf中的值

Integer age = (Integer)daf.get("age");

System.out.println("name:" + name + " <===> age:" + age);

return mapping.findForward("success");

}

}

④testDynaActionForm_success.jsp(取DynaActionForm的值)

测试动态ActionForm


姓名:${dynaActionForm.map.name }

年龄:${dynaActionForm.map.age }

(3)访问动态ActionForm与访问普通ActionForm的最大区别:属性的访问方式不同。

1)普通ActionForm——getter setter方法。

2)动态ActionForm——DynaActionForm把所有属性保存在Map中。

public Object get(String name)

public void set(String name, Object value)

注意:DynaActionForm的校验不太方便。需要继承DynaActionForm,但是写了代码又不能满足动态的功能了。

五、异常处理:

1、处理流程:

(1)Actionthrow Exception

(2)Action ServletExceptionHandler

(3)ExceptionHandler处理Exception ExceptionHandler会读配置文件

ActionMessage -> request Attribute

ActionForward

(4)ActionServlet ActionForward

2、配置struts的异常处理

全局的异常处理

....

在exception标签中的key,也就是在出现异常时会封装在ActionErrors中,也就是可以在页面中使用。

ActionError(String key, Object value0),可以通过在构造ActionError时,指定不同的key值来对异常进行分类,并且在html:error标签的自己构造ActionErrors并使用下面的方法发送void saveErrors(HttpServletRequest request,ActionErrors errors)这个方法用以把封装了异常的ActionErrors的key存储到request中。

六、Struts标签库

1、html标签库

(1)

对应html中的,使用会将表单中的属性自动封装成Form,他的action属性可以直接写struts的配置文件中的path

(2)、、、、

、、、、

以上者写标签的使用是和html中的form相对应的。

(3)这个标签用来表示一组选择项

java.util.ArrayList list=new java.util.ArrayList();

list.add(new org.apache.struts.util.LabelValueBean("show value","value"));

list.add(new org.apache.struts.util.LabelValueBean("show value1","value1"));

pageContext.setAttribute("vlauelist" list);

%>

2、Bean标签库

(1)bean标签库,是用来访为JavaBean的属性或者是为Bean的属性赋值,创建JavaBean,类似于JSP中的jsp:useBean动作的功能。

(2)bean标签库中的标签中大部分都有以下的属性:

1)id="xxx"指定Bean的名字标识,Bean在被读出后将引用保存在以这个id命名的对象中,也就是在JSP中使用的变量的引用。

2)name="xxxx"指定要读取Bean的名字

3)property="xxxx"

4)scope="page|request|session|application"

(3)资源读取标签

1)读取资源文件

2)使用这个标签可以对Cookie进行操作

3)读取header信息

eg.

if(testcookie.getValue.equals("emptyValue")){

javax.servlet.http.Cookie cook=

new javax.servlet.http.Cookie("/taglib/beancookie","taglib cookie");

cook.setComment("test");

cook.setMaxAge(3600);

response.addCookie(cook);

}

%>

(4)将资源写到页面的标签

1)将Bean的属性加入到输出流中

name属性是要加入的资源,也就是先前在其他资源标签中的

id属性定义的名字

2)定义变量

eg.

3)读取消息,可以根据key读取消息。

eg.

posted on 2010-05-05 01:22 ohgrateboy 阅读(708) 评论(0)  编辑  收藏 所属分类: struts框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值