??xml version="1.0" encoding="utf-8" standalone="yes"?>
取Session中的?/p>
<c:out value="${sessionScope.user.userId}"></c:out><br>
<c:out value="${user.userLoginName}"></c:out><br>
<s:property value="#session.user.userId"/><br>
${session.user.userId}<br>
${sessionScope.user.userId}<br>
OGNL
OGNL 是Object Graph Navigation Language 的简Uͼ详细相关的信息可以参考:http://www.ognl.org 。这里我们只涉及Struts2 框架中对OGNL 的基本支持?
OGNL 是一个对象,属性的查询语言。在OGNL 中有一个类型ؓMap 的Context Q称Z下文Q,在这个上下文中有一个根元素Qroot Q,Ҏ元素的属性的讉K可以直接使用属性名字,但是对于其他非根元素属性的讉K必须加上ҎW号# ?
在Struts2 中上下文为ActionContext Q根元素位Value Stack Q值堆栈,值堆栈代表了一族对象而不是一个对象,其中Action cȝ实例也属于值堆栈的一个)。ActionContext 中的内容如下图:
|
|--application
|
|--session
context map---|
|--value stack(root)
|
|--request
|
|--parameters
|
|--attr (searches page, request, session, then application scopes)
|
因ؓAction 实例被放在Value Stack 中,而Value Stack 又是根元素(root Q中的一个,所以对Action 中的属性的讉K可以不用标? Q而对其他的访问都必须使用# 标记?
引用Action 的属?
<s:property value="postalCode"/>
ActionContext 中的其他非根Qroot Q元素的属性可以按照如下的方式讉KQ?
<s:property value="#session.mySessionPropKey"/> or
<s:property value="#session["mySessionPropKey"]"/> or
<s:property value="#request["mySessionPropKey"]/>
Action cd以用ActionContext 中的静态方法来讉KActionContext ?
ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);
OGNL 与Collection QLists QMaps QSets Q?
生成List 的语法ؓ: {e1,e2,e3}.
<s:select label="label" name="name"
list="{'name1','name2','name3'}" value="%{'name2'}" />
上面的代码生成了一个HTML Select 对象Q可选的内容为: name1 Qname2 Qname3 Q默认gؓQname2 ?
生成Map 的语法ؓQ?{key1:value1,key2:value2}.
<s:select label="label" name="name"
list="#{'foo':'foovalue', 'bar':'barvalue'}" />
上面的代码生成了一个HTML Select 对象,foo 名字表示的内容ؓQfoovalue Qbar 名字表示的内容ؓQbarvalue ?
判断一个对象是否在List 内存在:
<s:if test="'foo' in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
<s:if test="'foo' not in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
取得一个List 的一部分Q?
? – 所有满选择逻辑的对?
^ - W一个满选择逻辑的对?
$ - 最后一个满选择逻辑的对?
例如Q?
person.relatives.{? #this.gender == 'male'}
上述代码取得q个人(person Q所有的h(this.gender==male Q的亲戚(relatives)
Lambda 表达?
OGNL 支持单的Lambda 表达式语法,使用q些语法可以建立单的lambda 函数?
例如Q?
Fibonacci:
if n==0 return 0;
elseif n==1 return 1;
else return fib(n-2)+fib(n-1);
fib(0) = 0
fib(1) = 1
fib(11) = 89
OGNL 的Lambda 表达式如何工作呢Q?
Lambda 表达式必L在方括号内部Q?this 表示表达式的参数。例如:
<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)] 定义了一个Lambda 表达式,
#fib(11) 调用了这个表辑ּ?
所以上qC码的输出为:89
在JSP2.1 ? 被用作了JSP EL Q表辑ּ语言Q的Ҏ记好Q所以对OGNL 的用可能导致问题,
一个简单的Ҏ是禁用JSP2.1 的EL Ҏ,q需要修改web.xml 文gQ?
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
关于EL表达式语a的简单ȝ
基本语法
一、EL?br />
1.语法l构
${expression}
2.[]?q算W?br />
EL 提供.和[]两种q算W来存取数据?br />
当要存取的属性名UC包含一些特D字W,??{ƈ非字母或数字的符P׃定要使用 []。例如:
${user.My-Name}应当改ؓ${user["My-Name"] }
如果要动态取值时Q就可以用[]来做Q?无法做到动态取倹{例如:
${sessionScope.user[data]}中data 是一个变?br />
3.变量
EL存取变量数据的方法很单,例如Q?{username}。它的意思是取出某一范围中名UCؓusername的变量?br />
因ؓ我们q没有指定哪一个范围的usernameQ所以它会依序从Page、Request、Session、Application范围查找?br />
假如途中扑ֈusernameQ就直接回传Q不再l找下去Q但是假如全部的范围都没有找到时Q就回传null?br />
属性范围在EL中的名称
Page PageScope
Request RequestScope
Session SessionScope
Application ApplicationScope
二、EL隐含对象
1.与范围有关的隐含对象
与范围有关的EL 隐含对象包含以下四个QpageScope、requestScope、sessionScope 和applicationScopeQ?br />
它们基本上就和JSP的pageContext、request、session和application一P
在EL中,q四个隐含对象只能用来取得范围属性|即getAttribute(String name)Q却不能取得其他相关信息?br />
例如Q我们要取得session中储存一个属性username的|可以利用下列ҎQ?br />
session.getAttribute("username") 取得username的|
在EL中则使用下列Ҏ
${sessionScope.username}
2.与输入有关的隐含对象
与输入有关的隐含对象有两个:param和paramValuesQ它们是EL中比较特别的隐含对象?br />
例如我们要取得用Lh参数Ӟ可以利用下列ҎQ?br />
request.getParameter(String name)
request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据?br />
${param.name}
${paramValues.name}
3.其他隐含对象
cookie
JSTLq没有提供设定cookie的动作,
例:要取得cookie中有一个设定名UCؓuserCountry的|可以使用${cookie.userCountry}来取得它?/p>
header和headerValues
header 储存用户览器和服务端用来沟通的数据
例:要取得用h览器的版本,可以使用${header["User-Agent"]}?br />
另外在鲜机会下Q有可能同一标头名称拥有不同的|此时必须改ؓ使用headerValues 来取得这些倹{?/p>
initParam
initParam取得讑֮web站点的环境参?Context)
例:一般的ҎString userid = (String)application.getInitParameter("userid");
可以使用 ${initParam.userid}来取得名UCؓuserid
pageContext
pageContext取得其他有关用户要求或页面的详细信息?br />
${pageContext.request.queryString} 取得h的参数字W串
${pageContext.request.requestURL} 取得h的URLQ但不包括请求之参数字符?br />
${pageContext.request.contextPath} 服务的web application 的名U?br />
${pageContext.request.method} 取得HTTP 的方?GET、POST)
${pageContext.request.protocol} 取得使用的协?HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户的IP 地址
${pageContext.session.new} 判断session 是否为新?br />
${pageContext.session.id} 取得session 的ID
${pageContext.servletContext.serverInfo} 取得L端的服务信息
三、ELq算W?br />
1.术q算W有五个Q?????或div?或mod
2.关系q算W有六个Q?=或eq?=或ne?lt;或lt?gt;或gt?lt;=或le?gt;=或ge
3.逻辑q算W有三个Q?amp;&或and、||或or?或not
4.其它q算W有三个QEmptyq算W、条件运符?)q算W?br />
例:${empty param.name}?{A?B:C}?{A*(B+C)}
四、EL函数(functions)?br />
语法Qns:function( arg1, arg2, arg3 …. argN)
其中ns为前|名U?prefix)Q它必须和taglib 指o的前|名UC|?/p>
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?/p>
补充Q?/p>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt " %>
FOREACH:
<c:forEach items="${messages}"
var="item"
begin="0"
end="9"
step="1"
varStatus="var">
……
</c:forEach>
OUT:
<c:out value="${logininfo.username}"/>
c:out>value 中的内容输出到当前位|,q里也就是把logininfo 对象?br />
username属性D出到面当前位置?br />
${……}是JSP2.0 中的Expression LanguageQELQ的语法。它定义了一个表辑ּQ?br />
其中的表辑ּ可以是一个常量(如上Q,也可以是一个具体的表达语句Q如forEach循环体中
的情况)。典型案例如下:
Ø ${logininfo.username}
q表明引用logininfo 对象的username 属性。我们可以通过“.”操作W引
用对象的属性,也可以用“[]”引用对象属性,?{logininfo[username]}
?{logininfo.username}辑ֈ了同L效果?br />
“[]”引用方式的意义在于,如果属性名中出CҎ字符Q如“.”或?#8220;-”Q?br />
此时必M?#8220;[]”获取属性g避免语法上的冲突Q系l开发时应尽量避?br />
q一现象的出玎ͼ?br />
与之{同的JSP Script大致如下Q?br />
LoginInfo logininfo =
(LoginInfo)session.getAttribute(“logininfo”);
String username = logininfo.getUsername();
可以看到QEL大大节省了编码量?br />
q里引出的另外一个问题就是,EL 从哪里扑ֈlogininfo 对象Q对?br />
${logininfo.username}q样的表辑ּ而言Q首先会从当前页面中L之前?br />
否定义了变量logininfoQ如果没有找到则依次到Request、Session?br />
Application 范围内寻找,直到扑ֈ为止。如果直到最后依然没有找到匹配的
变量Q则q回null.
如果我们需要指定变量的L范围Q可以在EL表达式中指定搜寻范围Q?br />
${pageScope.logininfo.username}
${requestScope.logininfo.username}
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
在Spring 中,所有逻辑处理单元q回的结果数据,都将作ؓAttribute 被放
|到HttpServletRequest 对象中返回(具体实现可参见Spring 源码?br />
org.springframework.web.servlet.view.InternalResourceView.
exposeModelAsRequestAttributesҎ的实C码)Q也是说Spring
MVC 中,l果数据对象默认都是requestScope。因此,在Spring MVC 中,
以下dҎ应慎用:
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
Ø ${1Q?}
l果辑ּ计算l果Q即整数??br />
Ø ${i>1}
如果变量值i>1的话Q将q回boolcdtrue。与上例比较Q可以发现EL会自
动根据表辑ּ计算l果q回不同的数据类型?br />
表达式的写法与java代码中的表达式编写方式大致相同?/p>
IF / CHOOSE:
<c:if test="${var.index % 2 == 0}">
*
</c:if>
判定条g一般ؓ一个EL表达式?br />
<c:if>q没有提供else子句Q用的时候可能有些不便,此时我们可以通过<c:choose>
tag来达到类似的目的Q?br />
<c:choose>
<c:when test="${var.index % 2 == 0}">
*
</c:when>
<c:otherwise>
!
</c:otherwise>
</c:choose>
cMJava 中的switch 语句Q?lt;c:choose>提供了复杂判定条件下的简化处理手法。其
?lt;c:when>子句cMcase子句Q可以出现多ơ。上面的代码Q在奇数行时输出“*”P
而偶数行时输?#8220;!”?br />
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?/p>
再补充:
1 EL表达式用${}表示,可用在所有的HTML和JSP标签?作用是代替JSP面中复杂的JAVA代码.
2 EL表达式可操作帔R 变量 和隐式对? 最常用?隐式对象?{param}?{paramValues}. ${param}表示q回h参数中单个字W串的? ${paramValues}表示q回h参数的一l?pageScope表示面范围的变?requestScope表示h对象的变? sessionScope表示会话范围内的变量.applicationScope表示应用范围的变?
3 <%@ page isELIgnored="true"%> 表示是否用EL语言,TRUE表示止.FALSE表示不禁?JSP2.0中默认的启用EL语言.
4 EL语言可显C?逻辑表达式如${true and false}l果是false 关系表达式如${5>6} l果是false 术表达式如 ${5+5} l果?0
5 EL中的变量搜烦范围?page request session application 点运符(.)?[ ]"都是表示获取变量的?区别是[ ]可以昄非词cȝ变量
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/stonec/archive/2009/10/09/4647394.aspx
<?xml version="1.0" encoding="GBK"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
二、copy所需sitemesh-2.3.jar到WEB-INF\lib下?/span>Q这里可以下?a target="_blank">http://www.opensymphony.com/sitemesh/Q?br />
<decorators defaultdir="/decorators"> <decorator name="main" page="main.jsp"> <pattern>*</pattern> </decorator> </decorators> |
上面配置文g指定了装饰器面所在的路径Qƈ指定了一个名为main的装饰器Q该装饰器默认装饰web应用根\径下的所有页面?br />
四?建立装饰器页?/decorators/main.jsp
<%@ page contentType="text/html; charset=GBK"%> <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%> <html> <head> <title><decorator:title default="装饰器页?.." /></title> <decorator:head /> </head> <body> sitemesh的例?lt;hr> <decorator:body /> <hr>chen56@msn.com </body> </html> |
五?font size="2">建立一个的被装饰页?/index.jsp(内容面)
<%@ page contentType="text/html; charset=GBK"%> <html> <head> <title>Agent Test</title> </head> <body> <p>本页只有一句,是本句.</p> </body> </html> |
最后访问index.jspQ将生成如下面Q?/font>
而且Q所有的面也会如同index.jsp一P被sitemesh的filter使用装饰模式修改成如上图般模P却不用再使用include标签?/font>
装饰?nbsp; decorator概念 | ||||||
Z建立可复用的web应用E序,一个通用的方法是建立一个分层系l,如同下面一个普通的web应用Q?/font>
可糟p的是前端的面逻辑很难被复用,当你在每一个页面中用数之不的include来复用公qheader, stylesheet, scriptsQfooterӞ一个问题出C-重复的代码,每个面必须用copy来复用页面结构,而当你需要创意性的改变面l构ӞNq上了你?/font> sitemesh通过filter截取request和responseQƈl原始的面加入一定的装饰(可能为header,footer...)Q然后把l果q回l客LQƈ且被装饰的原始页面ƈ不知道sitemesh的装饎ͼq也pCp的目的?/font> 据说卛_新出台的Portlet规范会帮助我们标准的实现比这些更多更cool的想法,但可怜的我还不懂它到底是一个什末东东,有兴的人可以研I?br /> jetspeedQ或JSR (Java Specification Request) 168,但我想sitemesh如此单,我们不妨先用着?/font>
|
||||||
让我们看看怎样配置环境 | ||||||
除了要copy到WEB-INF/lib中的sitemesh.jar外,q有2个文件要建立到WEB-INF/Q?/font>
sitemesh.xml 可以讄2U信?Page Parsers Q负责读取stream的数据到一个Page对象中以被SiteMesh解析和操作?不太常用Q默认即? Decorator Mappers : 不同的装饰器U类Q我发现2U比较有用都列在下面。一U通用的mapper,可以指定装饰器的配置文g名,另一U可打印的装饰器Q可以允怽当用http://localhost/aaa/a.html?printable=true方式讉K时给出原始页面以供打?免得把header,footer{的花哨的图片也搭上) 范例Q?/strong>
decorators.xml Q定义构成复合视囄所有页面构件的描述(主要l构面Qheader,footer...)Q如下例Q?/font>
|
||||||
最重要的是写出装饰器本w?也就是那些要复用面Q和l构面)?/font> | ||||||
其实Q重要的工作是制作装饰器页面本w?也就是包含结构和规则的页?Q然后把他们描述到decorators.xml中?/font>
让我们来先看一看最单的用法Q其实最常用也最单的用法是我们的hello例子Q面对如此众多的技术,我想只要辑ֈ功能点到为止卛_Q没必要ȝI太?除非您有更深的需??/font>
我们在装饰器面只用?个标{: <decorator:title default="装饰器页?.." /> Q?把请求的原始面的title内容插入?lt;title></title>中间?/font> <decorator:body /> Q?把请求的原始面的body内的全部内容插入到相应位|?/font> 然后我们在decorator.xml中加入以下描q即可: <decorator name="main" page="main.jsp"> q样Q请求的所有页面都会被重新处理Qƈ按照main.jsp的格式重新展现在你面前?/font>
|
||||||
让我们看看更多的用法?抄袭sitemesh文档) | ||||||
以下列着全部标签Q?/font>
插入原始面(被包装页?的head标签中的内容(不包括head标签本n)?/font> <decorator:body />插入原始面(被包装页?的body标签中的内容?/font> <decorator:title [ default="..." ] /> 插入原始面(被包装页?的title标签中的内容Q还可以d一个缺省倹{?/font> 例: /decorator/main.jsp?Q装饰器面Q? <title><decorator:title default="却省title-hello" /> - 附加标题</title> /aaa.jsp?(原始面)Q?lt;title>aaa面</title> 讉K/aaa.jsp的结果:<title>aaa面 - 附加标题</title> <decorator:getProperty property="..." [ default="..." ] [ writeEntireProperty="..." ]/> 在标{֤插入原始面(被包装页?的原有的标签的属?/font>中的内容Q还可以d一个缺省倹{?/font> sitemesh文档中的例子很好理解Q?/font> 注意Q?/strong> <decorator:usePage id="..." /> 例:可用<decorator:usePage id="page" /> Q?/strong><%= 应用包装器到指定的页面上Q一般用于被包装面中主动应用包装器。这个标{有点不好理解,我们来看一个例子: 包装器页?/decorators/panel.jspQ?lt;p><decorator:title /></p> ... <p><decorator:body /></p> 最后会是什末结果呢Q除?page.jsp会被默认的包装页面包装上header,footer外,page.jsp面中还内嵌了date.jsp面Qƈ且此date.jsp面q会被panel.jsp包装Z个title加body的有2D늚面Q第1D|date.jsp的titleQ第2D|date.jsp的body内容?/font> 另外Q?a name="page:applyDecorator">page:applyDecorator中包含的page:param标签所声明的属性D可以在包装页面中?/font>decorator:getProperty标签讉K到? |
可打印的界面装饰 | |
前面说过?U可打印的装饰器Q可以允怽当用http://localhost/aaa/a.html?printable=true方式讉KӞ应用其他的装饰器(自己指定)Q给出原始页面以供打?免得把header,footer{的花哨的图片也搭上)?/font>
让我们来看一看怎样实现他: 1.首先在WEB-INFO/sitemesh.xml中设|: 2.在WEB-INFO/decorators.xml中定义相应的printable装饰?br /> <decorator name="printable" page="printable.jsp"/> 3.最后编写printable装饰?decorators/printable.jsp
q样可以让一个原始页面通过?printable=true开x切换不同的装饰器面?/font>
|
中文问题 |
׃sitemesh内部所使用的缺省字W集为iso-8859-1Q直接用会产生qQ我们可以通过以下ҎU正之:
|
ȝQ用sitemesh最通常的途径Q?/font> |
1.配置好环境, 2.在WEB-INFO/decroators.xml中描qC徏立的包装器?/font> 3.开发在decroators.xml中描q的包装器,最好存攑֜/_decorators目录?/font> 4.ok Q可以看看辛勤的成果?:) |
关闭IIS有两U方法,L一U都可以Q?/p>
net stop iisadmin
上述命o关闭了iis相关的所有服务器Q比如web sites 、smtp{?code>net stop iisadmin /y避免输入上面那个命o后需要在输入y如果用net stop w3svc只是关闭一个站?w服务器,但是如果是多个web站点׃行?如果开启IIS可以在控刉板中扑ֈinteret信息服务打开|站服务的方法,也可以用命名Qnet start w3svc都可以。注意如果直接在服务中打开IIS Admin服务或者运动net start iisadminQ是可以打开IIS Admin服务Q但?w服务没有打开Q所以依旧需要用上面的方法打开3w服务Q因为在打开IIS Admin服务没有打开3w服务Q但是打开3w服务肯定打开了IIS Admin服务?/p>
psQApache 2不能在Windows 95上运行;在Windows 98上勉够运行,但不能作为服务用。从4.3版本开始,PHP也不再支持Windows 95。所以,你的Windows操作pȝ必须是Windows NT?000或者XP?/p>
扑ֈ #Listen 12.34.56.78:80 #是注释符?/span>
Listen 80 Ҏ Listen 8080
然后扑ֈ ServerName localhost:80 Ҏ ServerName localhost:8080 卛_
ps[2005.9.29].利用apache的proxy模块实现隐藏iis的端?/p>
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
ProxyPass /iis/ http://127.0.0.1:8080/
ProxyPassReverse /iis http://127.0.0.1:8080
q样可以在览器中输入localhost讉KapacheQ输入localhost/iis/讉Kiis了而隐藏了8080端口
<VirtualHost *:80>
ServerAdmin kavenyan@163.com
DocumentRoot E:/www/dancewithnet
ServerName www.dancewithnet.com
ServerAlias dancewithnet.com
DefaultLanguage zh-CN
AddDefaultCharset UTF-8
</VirtualHost>
<VirtualHost *:80>
ServerAdmin kavenyan@163.com
ServerName iis.dancewithnet.com
DefaultLanguage zh-CN
AddDefaultCharset GB2312
ProxyPass / http://127.0.0.1:8080/ or http://服务器ip:8080/
ProxyPassReverse / http://127.0.0.1:8080/ or http://服务器ip:8080/
</VirtualHost>
q样可以用www.dancewithnet.com讉Kapache,iis.dancewithnet.com讉Kiss,而隐藏了8080端口
psQ?Apache 2可采?U方式来q行PHPE序Q通过一个CGI接口来运行(外部调用Php.exeQ,或者用PHP的DLL文g在Apache的内部运行。后一U方式的速度较快。所以,针对每个版本的PHPQ都会提?个Windows二进制发行包。较的?msi包,它会安装CGI可执行程序Php.exeQ但其中拿掉了通过Apache DLL来运行PHP脚本所需的模块。较大的.zip包则包含了所有这些东?/p>
c:\\winnt\\system32 for Windows NT/2000
或?
c:\\winnt40\\system32 for Windows NT/2000 服务器版
c:\\windows\\system32 for Windows XP
psQ也有把php文g中所有的dll文g都拷?windir%\System中的Q那L配置和我介绍的方法稍微有点不同,但是我觉得那h较杂乱,׃再说明,有兴的朋友可以自己研究?/p>
c:\\winnt ?c:\\winnt40 for Windows NT/2000 服务器版
c:\windows for Windows XP
ScriptAlias /php/ "c:/web/php5/"
AddType application/x-httpd-php .php
Action application/x-httpd-php "/php5/php.exe"
如果作ؓ模块Q推荐这U方式)Q添加代码如下:
LoadModule php5_module "c:/web/php5/php5apache2.dll"
AddType application/x-httpd-php .php
l节部分我就不多讲了Q因为我也不会,p讲我是如何调试出来我的第一个JSON使用的吧
采用的框架有QStruts2 ?JQuery ?JSON
按着步骤来吧Q?/p>
1.新徏一个Web工程
导入包列表:
目录l构如图Q?/p>
2.建立实体cUser
package model;
public class User
private String name;
private int age;
//省略相应的get和setҎ
3.建立Action JsonAction
public class JsonAction extends ActionSupport{
private static final long serialVersionUID =
7044325217725864312L;
private User user;
//用于记录q回l果
private String result;
//省略相应的get和setҎ
@SuppressWarnings("static-access")
public String execute() throws Exception {
//要q回的user实体对象q行json处理
JSONObject jo = JSONObject.fromObject(this.user);
//打印一下,格式如下
//{"name":"风达","age":23}
System.out.println(jo);
//调用json对象的toStringҎ转换为字W串然后赋值给result
this.result = jo.toString();
return this.SUCCESS;
}
}
4.建立struts.xml文g
<?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>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<package name="ttttt" extends="json-default">
<action name="jsonAction" class="action.JsonAction">
<result type="json" >
<!-- 因ؓ要将reslut的D回给客户端,所以这栯|?-->
<!-- root的值对应要q回的值的属?-->
<param name="root">
result
</param>
</result>
</action>
</package>
</struts>
5.~写index.jsp文g
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!-- basePath用来获取js文g的绝对\?-->
<script type="text/javascript" src="<%=basePath%>js/jquery.js"></script>
<script type="text/javascript" src="<%=basePath%>js/index.js"></script>
<s:head theme="ajax" />
</head>
<body>
<div id="result">
</div>
<s:form name="userForm" action="" method="post">
<s:textfield label="用户? name="user.name" />
<s:textfield label="q龄" name="user.age" />
<button>
提交
</button>
</s:form>
</body>
</html>
6.在WebRoot目录下徏立js文gӞjquery.js文g攑ֈ文g夹下Q然后再建立文gindex.js
$(document).ready(function() {
// 直接把onclick事g写在了JS?/p>
$("button").click(function() {
// 序列化表单的?/p>
var params = $("input").serialize();
$.ajax({
// 后台处理E序
url : "jsonAction.action",
// 数据发送方?/p>
type : "post",
// 接受数据格式
dataType : "json",
// 要传递的数据
data : params,
// 回传函数
success : update_page
});
});
});
function update_page(result) {
var json = eval( "("+result+")" );
var str = "姓名:" + json.name + "<br />"; str += "q龄:"
+ json.age + "<br />";
$("#result").html(str);
}
7.q行前效?
要的是效果,布局׃整了
q行后效果:
|上相关的信息太了Q很多Struts2+JQuery+JSON的教E,点开链接之后都是那几文章{了又转,遇到问题真的很想扑ֈ有用的信息,或许是我太笨了,找不刎ͼ或许是|上相关的信息就很少。这个实例很单是不是Q但是ؓ了调试出q个E序Q我费了一天的旉?/p>
上面的实例成功了Q但是问题又出来?/p>
视图cd仅仅讄了json
那么输入校验出错的时候怎么昄Q?/p>
本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/fengda2870/archive/2009/04/06/4052527.aspx