『壹』 struts2 中json跳转问题
问题描述的不是很清楚
没太看明白,
可否详细说说!~
『贰』 struts2中如何获得json格式数据
后台获得前台的数据自己可以写特定的方法截取里面的属性,主要用.split(",")和.split(":")前台用jquery的.each方法就可以了
『叁』 struts2里面怎么用el表达式取值
struts2中action及其属性会被谈败包装成actionContext,在actionContext中有含液颤request、session等各个域,action中的属性会同步到request中,也就是放到了request作用域埋郑中,所以el表达式也可以取出。
你也可以用ActionContext.getSession.put(),(不知道记错没,你可以试试)手动将某个属性值放到session中,然后在jsp页面用el表达式也可以取出来。
『肆』 struts2中为Action指定json返回类型时,如何捕获异常
通过Struts的声明式异常来捕获用户自定义异常 然后统一的异常处理页面 现在流版程是这样权: 运行A页面,页面的js上有一个Ajax方法,读取后台数据,以表格的形式显示在A页面 在测试的时候发现,不管在业务逻辑层或者是Action中,加入System.out.println(1/0); 都无法跳转到统一的一次处理页面 既然是json数据的。那么可以try catch处理。 在catch中返回一个识别的字符,在前台判断,如果是识别的字符串,手动跳转到错误页面。并且在catch中用log记录错误消息,以便调试。 做个过滤器,如果发现抛出异常,就返回特定json类。可以把异常信息等也包放到这个类里。 然后在页面获取JSON时候判断返回值是不是是不是错误信息,再判断是否需要重新跳转页面,或者alert出这个异常信息就可以。 呃,好像不是这个意思。
『伍』 struts2中如何将json格式的数据传到前端
最简单的,可以放到域枣祥芹对象中宴局,返回给前凳毕端jsp页面,使用el表达式获取
『陆』 JSP在Struts 2中使用JSON Ajax支持
JSON插件提供了一种名为json的ResultType,一旦为某个Action指定了一个类型为json的Result,则该Result无需映射到任何视图资源。因为JSON插件会负责将Action里的状态信息序列化成JSON格式的数据,并将该数据返回给客户端页面的javaScript。
简单地说,JSON插件允许我们在JavaScript中异步调用Action,而且Action不再需要使用视图资源来显示该Action里的状态信息,而是由JSON插件负责将Action里的状态信息返回给调用页面——通过这种方式,就可以完成Ajax交互。
Struts2提供了一种可插拔方式来管理插件,安装Struts2的JSON插件与安装普通插件并没有太大的区别,一样只需要将Struts2插件的JAR文件复制到Web应用的WEB-INF/lib路径下即可。
安装JSON插件按如下步骤进行:
(1)登陆
(2)将下载到的jsonplugin-0.7.jar文件复制到Web应用的WEB-INF路径下,即可完成JSON插件的安装。
实现Actio逻辑
假设wo,en输入页面中包含了三个表单域,这三个表单域对于三个请求参数,因此应该使用Action来封装这三个请求参数。三个表单域的name分别为field1、field2和field3。
处理该请求的Action类代码如下:
public class JSONExample
{
//封装请求参数的三个属性
private String field1;
private transient String field2;
private String field3;
//封装处理结果的属性
private int[] ints = {10, 20};
private Map map = new HashMap();
private String customName = "custom";
//三个请求参数对应的setter和getter方法
public String getField1()
{
return field1;
}
public void setField1(String field1)
{
this.field1 = field1;
}
//此处省略了field1和field2两个字段的setter和getter方法
...
//封装处理结果的属性的setter和getter方法
public int[] getInts()
{
return ints;
}
public void setInts(int[] ints)
{
this.ints = ints;
}
public Map getMap()
{
return map;
}
public void setMap(Map map)
{
this.map = map;
}
//使用注释语法来改变该属性序列化后的属性名
@JSON(name="newName")
public String getCustomName()
{
return this.customName;
}
public String execute()
{
map.put("name", "yeeku");
return Action.SUCCESS;
}
}
在上面代码中,宏蔽派使用了JSON注释,注释时指定了name域,name域指定Action属性被序列化成JSON对象的属性名。除此之外,JSON注释还支持如下几个域:
serialize:设置是否序列化该属性
deserialize:设置是否反序列化该属性。
format:蔽贺设置用于格式化输出、解析日期表单域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。
配置该Action与并丛配置普通Action存在小小的区别,应该为该Action配置类型为json的Result。而这个Result无需配置任何视图资源。
配置该Action的struts.xml文件代码如下:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"">
<struts>
<constant name="struts.i18n.encoding" value="UTF-8"/>
<package name="example" extends="json-default">
<action name="JSONExample" class="lee.JSONExample">
<result type="json"/>
</action>
</package>
</struts>
在上面配置文件中有两个值得注意的地方:
第一个地方是配置struts.i18n.encoding常量时,不再是使用GBK编码,而是UTF-8编码,这是因为Ajax的POST请求都是以UTF-8的方式进行编码的。
第二个地方是配置包时,自己的包继承了json-default包,而不再继承默认的default包,这是因为只有在该包下才有json类型的Result。
『柒』 java struts2.json.JSONException怎么解决
Servlet的不写了,也就是how to use HttpRequest和HttpResponse。主要是在Struts2身上。
以文章所描述的方法似乎总是差了那么点东西:可以不使用那么多配置吗?
于是研究了些时间,可以这么玩:
1)Eclipse引用Struts2的让兆JSON plug-in和Convertion plug-in。
2)struts.xml这么写:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!-- 把它设置为开发模式,发布时要设置为false -->
<constant name="struts.devMode" value="true" />
<!-- 设置在class被修改时是否热加载,发布时要设置为false -->
<constant name="struts.convention.classes.reload" value="true"/>
<!-- 自动动态方法的调用,使用这个设置后可以这样调用:action!method -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<悉搭!-- 指定jsp文件所在的目录地址 -->
<constant name="struts.convention.result.path" value="/WEB-INF/content/" />
<!-- 用于配置包名后缀。默认为action、actions、struts-->
<!-- <constant name="struts.convention.package.locators" value="controller" /> -->
<constant name="struts.convention.action.packages" value="com.my.controller"></constant>
<!-- 用于配置类名后缀,默认为Action,设置后,Struts2只会去找这种后缀名的类做映射 -->
<constant name="struts.convention.action.suffix" value="Controller"/>
<!-- 设置即使没有@Action注释,依然创建Action映射。默认值是false。因为Convention-Plugin是约定优于配置的风格,
可以不通过注解根据预先的定义就能访问相应Action中的方法 -->
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<!-- 自定义jsp文件命名的分隔符 -->
<constant name="struts.convention.action.name.separator" value="-" /坦陆租>
<!-- 国际化资源文件名称 -->
<constant name="struts.custom.i18n.resources" value="i18n" />
<!-- 是否自动加载国际化资源文件 -->
<constant name="struts.i18n.reload" value="true" />
<!-- 浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="false" />
<!-- 上传文件大小限制设置 -->
<constant name="struts.multipart.maxSize" value="-1" />
<!-- 主题,将值设置为simple,即不使用UI模板。这将不会生成额外的html标签 -->
<constant name="struts.ui.theme" value="simple" />
<!-- 编码格式 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 设置默认package -->
<constant name="struts.convention.default.parent.package" value="default"></constant>
<package name="default" namespace="/" extends="json-default">
<interceptors>
<interceptor name="cacheInterceptor" class="com.my.interceptor.CacheInterceptor" />
<interceptor-stack name="cacheStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack"></interceptor-ref>
<interceptor-ref name="cacheInterceptor"></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="cacheStack"></default-interceptor-ref>
<default-action-ref name="index" />
<global-results>
<!-- <result name="error">/error.jsp</result> -->
<result name="json" type="json">
<!-- 是否包括父类的属性输出,默认true. -->
<!-- <param name="ignoreHierarchy">false</param> -->
<!-- 是否输出null值的属性,默认false -->
<!-- <param name="excludeNullProperties">true</param> -->
</result>
</global-results>
<global-exception-mappings>
<exception-mapping exception="java.lang.Exception" result="error"/>
</global-exception-mappings>
</package>
</struts>
上面有两个<param/>注释了,使用方法已经有写在里头,如果需要,可以加上或在类中加入@Results。
关键点在于把<package />中的 extends设置为json-default,以及在global-results中的这个json result。
3)加入一个UserControl.java
package com.my.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import net.sf.json.JSONObject;
import com.my.beans.User;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
public class UserController extends ActionSupport {
private User user = new User();
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
private String json;
public String getJson() {
return json;
}
public void setJson(String json) {
this.json = json;
}
private List<User> users = new ArrayList<User>();
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public String loadModel() throws IOException {
System.out.println("json=" + getJson());
System.out.println("user=" + getUser().getUsername());
System.out.println("users=" + getUsers().size());
User userBean = new User();
userBean.setUsername("robin");
users.add(userBean);
this.setJson(JSONObject.fromObject(userBean).toString());
return "json";
}
}
这里没有什么特别的东西,就是一些getter/setter,以及一个loadModel() action
4)JS对JSON的提交:
var url = "user!loadModel";
var params = {
"json": "json string",
"user.username" : "zhang",
"users[0].username" : "zhang1",
"users[0].password" : "1",
"users[1].username" : "zhang2",
"users[1].password" : "2",
};
$.post(url, params, function callback(data) {
console.log(data)
});
这里是重点。
可以看到这段JS里的params有:json/user.username/users[X].username
其中:
a) json
对应的就是上页java中的getJson/setJson,这个东东列出来是可以用于在页面与服务器之间传递JSON字符串用的。如果你需要在action中输出或提交json的字符串,它有很大作用,直接到位。但是缺点是要自己去将对象转化为json string以及json string转化为对象。
b) user.username
这样的写法可以在后台java中直接转化成了对象。user.username中的user就是java中的user object。
c) users[0].username
这可以直接转化成后台java中的List<user>对象users。
可以看出,Struts2是可以完成将json直接转化成java object的。不过这样的写法,不是好的。因为这个JS的JSON只能称作是一个字符串拼接,不是一个JSON object
还有一种方法,使用ModelDriven:
package com.my.controller;
import com.my.beans.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
@SuppressWarnings("serial")
public class UserModelController extends ActionSupport implements
ModelDriven<Object> {
private User user = new User();
@Override
public Object getModel() {
return user;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
public String load() {
return "json";
}
}
使用ModelDriven,可以JS直接提交JSON了:
var url = "user-model!load";
var params = {
"username": "zhang1",
"password": "123456"
};
$.post(url, params, function callback(data) {
console.log(data)
});
这个params才是真正的JSON object,它会被ModelDriven直接转成user model。
但是:它似乎不能提交List object。至今写文时也没有找到在ModelDriven中可以提交JSON array to List的方法。
如果需要提交复杂的JSON到服务器,如果你用的是Struts,使用第一种方法的json的getter/setter吧。
『捌』 struts2注解 怎么样返回json
返回的对象是实体类得对象的话,先把重写实体类的toString方法:
public
String
toString(){
String
json
=
"{属性1:'%s',属性2:'%s',属性3:'%s',属性4:'%s'}";
//如果是int类型就把单引号去掉,把%s改成%d,double就改成%f
return
String.forMat(json,属性1,属性2,属性3,属性4,);
}
这是实体类里面的
在Action里面使用out.print()打印输出对象的行了,返回return
null;
『玖』 在struts2+ajax使用json传递数据的工程中,返回的数据为null
这是struts常用配置,表示返回的json对象,加了之后data就能获取到这个对象
『拾』 struts2 怎样读取json数据
一.认识JSON
JSON是一种轻量级、基于文本、与语言无关的数据交换格式,可以用文本格式的形式来存储或表示结构化的数据。
二.POST请求与Content-Type: application/json
常用的HTTP请求方法有GET, POST, PUT, DELETE等。在提交POST请求时,请求数据放在消息体(Body)中,请求数据的格式及编码方式用Content-Type来指定。如我们常用的表单<form>提交,其Content-Type默认为application/x-www-form-urlencoded,提交的数据按照key1=val1&key2=val2进行编码,服务器端也能很容易地解析K-V值。
JSON的出现,让交换的数据不再仅限于简单的K-V结构,而可以有更加复杂的层级,特别适合于RESTful接口。在发送请求时,指定Content-Type为application/json,即可使用JSON字符串作为请求的数据。而在服务器端接收到该请求后,将按照JSON字符串对请求数据进行处理。
三.Struts2接收JSON请求
在Struts2的Action中提取Content-Type为application/x-www-form-urlencoded的POST参数,我们非常熟悉:在Action中定义属性及其getter, setter方法,接收到请求时,默认会将与属性同名的参数值赋予该属性。
但是对Content-Type为application/json的请求数据,Struts2默认无法解析。因为请求的JSON数据需从输入流中读取出来,无法直接从ServletRequest的请求参数中解析。很容易想到,要读取JSON请求数据,最直接的方式就是从输入流读取。而同时,Struts2的strus2-json-plugin也提供了有关的拦截器,对JSON请求数据进行解析。下面将对两种方案进行分析:
1.从输入流中读取JSON请求数据,以下是在Action中实现的一个读取输入流数据的方法
解析得到JSON对象后,遍历JSON对象,取出K-V,通过反射的V设置给予K相同的属性
开发者可根据自己的需求进行选择:从输入流直接读取JSON请求数据,或使用struts2-json-plugin对JSON请求数据进行处理。