public String testByAction() {
// dataMap 中的数据将会被 Struts2 转换成 JSON 字符串,所以这里要先清空其中的数据
dataMap.clear();
User user = new User();
user.setId("123");
user.setName("JSONActionStruts2");
user.setPassword("123");
user.setSay("Hello world !");
dataMap.put("user", user);
// 放入一个是否操作成功的标识
dataMap.put("success", true);
// 返回结果
return SUCCESS;
}struts.xml 中 action 的配置:<package name="json" extends="json-default" namespace="/test">
<action name="testByAction"
class="cn.ysh.studio.struts2.json.demo.action.UserAction" method="testByAction">
<result type="json">
<!-- 这里指定将被 Struts2 序列化的属性,该属性在 action 中必须有对应的 getter 方法 -->
<param name="root">dataMap</param>
</result>
</action>
</package>凡是使用 Struts2 序列化对象到 JSON 的 action,所在的 package 必须继承自 json-default,注意,这里唯一的 result,没有指定 name 属性。
解决方案 »
- 求大神解决前台查询输出问题
- 请问怎样在SSH中使用AJAX???
- 高分求助!项目发布到外网,无显示内容!
- div高度固定好后,它是否能根据浏览器的大小自动的伸缩??
- 想了解一下北京软通动力软件公司情况
- 在javabean中连接mysql查询时,sql语句正确就是没有结果
- 怎样点击链接调用Acrobat Reader,而不是直接在ie中打开pdf
- 请问各位出现这个错误是什么原因?在线急等
- 能否在页面设置一个按钮,点击的时候,保存本页面为指定目录下的指定文件(在线等待)
- 怎么样能够把文件上传到服务器的任意目录下??
- vs2015开发应用程序实现跨平台是否会降低java开发使用率。
- java web中quartz无法正常触发的原因
<action name="menuAction" class="menuAction">
<result type="plainText" />
</action>然后再你Action里,将你的list先转换为json格式的字符串,然后回写到客户端,buildObjListToJson,toWrite这两个方法你可以自己写,没有任何难度。//这是我的action,分发方式和你的不一样,但是result都是一样,继承execute的返回值任意字符串就行。
public void getIllusionComments() {
message = illusionCommentService.getIllusionComments(request
.getParameterMap());//业务处理,结果是经过封装的list
String strData = JsonBuilder.getInstance().buildObjListToJson(
(long) message.getExtendInt1(),
(List<IllusionComment>) message.getObj(), true);//将list转换为json格式的字符串,方法见下
toWrite(strData);//回写客户端,方法见下
}/**
* 为分页列表提供Json封装
*
* @param count
* 记录总数
* @param entities
* 实体列表
* @param excludes
* 在json生成时需要排除的属性名称
* @return
*/
public String buildObjListToJson(Long count,
Collection<? extends Object> records, boolean listJson) {
try {
StringBuffer pageJson = null;
if (listJson) {
pageJson = new StringBuffer("{totalCount:" + count + ","
+ "rows" + ":");
} else {
pageJson = new StringBuffer("");
}
// 序列化配置项
// MAP中的key如果对应的value为null则不参与json输出
// logger.debug("into buildPageJson..."); StringWriter w = new StringWriter();
JsonHolder.mapper.configure(
SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
JsonHolder.mapper.writeValue(w, records);
pageJson.append(w);
w.close(); if (listJson) {
pageJson.append("}");
} else {
pageJson.append("");
}
return pageJson.toString();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
} /**
* 将数据写出到前台 默认为UTF-8编码
*
* @param contents
*/
protected void toWrite(String contents) {
response.setContentType("text/html;charset=UTF-8");
if (ObjectUtils.isNotNull(response)) {
Writer writer = null;
try {
response.setCharacterEncoding("utf-8");
writer = response.getWriter();
writer.write(contents);
} catch (IOException e) {
e.printStackTrace();
} finally {
log.debug("write into response, contents is : " + contents);
try {
writer.flush();
writer.close();
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private int id;
private String text;
private boolean leaf;
private String cls;
private List<Menu> children;TreeDAOImpl.java
public List<Tree> findAllRole() {
String hql = "from Tree";
return (List<Tree>)this.getHibernateTemplate().find(hql);
}
在Action 里如果不连接数据库取数就这样,所以想把下面的改成可以取数据库的方式
public String execute() { menus = new ArrayList<Menu>();
Menu benz = new Menu();
benz.setText("广东");
benz.setCls("folder");
benz.setLeaf(false);
benz.setId(10);
menus.add(benz);
List<Menu> benzList = new ArrayList<Menu>();
benz.setChildren(benzList);
Menu menu;
menu = new Menu();
menu.setText("广州");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(11);
benzList.add(menu);
menu = new Menu();
menu.setText("深圳");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(12);
benzList.add(menu);
Menu bmw = new Menu();
bmw.setText("广西");
bmw.setCls("folder");
bmw.setLeaf(false);
bmw.setId(20);
menus.add(bmw);
List<Menu> bmwList = new ArrayList<Menu>();
bmw.setChildren(bmwList);
menu = new Menu();
menu.setText("桂林");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(21);
bmwList.add(menu);
menu = new Menu();
menu.setText("北海");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(22);
bmwList.add(menu);
JSONArray jsonObject = JSONArray.fromObject(menus);
try {
menuString = jsonObject.toString();
} catch (Exception e) {
menuString = "ss";
}
System.out.println("output menuString: " + menuString); return "success";
}
另外,把逻辑写在action里?不推荐这样,搞个服务也逻辑,action应该像我那样一个请求10行以内的代码,
message = illusionCommentService.getIllusionComments(request
.getParameterMap());//业务处理
这里面不但有大量的数据库操作,还可能包括邮件、外部接口等异步操作,所以MVC这种模式还是要严格遵守的。
public String execute() { menus = new ArrayList<Menu>();
Menu benz = new Menu();
benz.setText("广东");
benz.setCls("folder");
benz.setLeaf(false);
benz.setId(10);
menus.add(benz);
List<Menu> benzList = new ArrayList<Menu>();
benz.setChildren(benzList);
Menu menu;
menu = new Menu();
menu.setText("广州");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(11);
benzList.add(menu);
menu = new Menu();
menu.setText("深圳");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(12);
benzList.add(menu);
Menu bmw = new Menu();
bmw.setText("广西");
bmw.setCls("folder");
bmw.setLeaf(false);
bmw.setId(20);
menus.add(bmw);
List<Menu> bmwList = new ArrayList<Menu>();
bmw.setChildren(bmwList);
menu = new Menu();
menu.setText("桂林");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(21);
bmwList.add(menu);
menu = new Menu();
menu.setText("北海");
menu.setCls("file");
menu.setLeaf(true);
menu.setId(22);
bmwList.add(menu);
JSONArray jsonObject = JSONArray.fromObject(menus);
try {
menuString = jsonObject.toString();
} catch (Exception e) {
menuString = "ss";
}
System.out.println("output menuString: " + menuString); return "success";
}
这个方法应该能帮到你
public void outputResult(HttpServletResponse res,
Map<String, Object> map) {
PrintWriter out = null;
try {
res.setCharacterEncoding("UTF-8");
out = res.getWriter();
logger.info("进入输出结果到前台的界面的方法");
// 输出到前台
ObjectMapper mapper = new ObjectMapper();
try {
mapper.writeValue(out, map);
} catch (JsonGenerationException e) {
logger.info(e.getStackTrace());
} catch (JsonMappingException e) {
logger.info(e.getStackTrace());
} catch (IOException e) {
logger.info(e.getStackTrace());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
out.flush();
out.close();
}
}
功能非常基础,关键考验你数据库的设计,做菜单的话一般要考虑很多RBAC权限方面的问题以及菜单层次的问题。
我不知道你怎么配的hibernate,我使用spring托管hibernate以及hibernateTemplate,和你实现方式不一样,但是大体没什么出入,都是对象化的查询。如下:
hibernateTemplate.find("from " + clazz.getName());
这些都是hibernate的基础,非常非常简单,网上一堆资料。
通过父子关系去构造一个树,而不是把他们全取出来。比如根据广西,获取广西下面的市。有个children属性是该节点下面的子节点是这部分不知道怎写
通过父子关系去构造一个树,而不是把他们全取出来。比如根据广西,获取广西下面的市。有个children属性是该节点下面的子节点是这部分不知道怎写
whereStr = " name = '广西' ";//这个当然是作为参数的,不是写死的
hibernateTemplate.find("from " + clazz.getName() + " where "
+ whereStr);2.hibernate基础,一对多。我是用的注解写的例子,ErNoBillItem是子表,配置文件也一样:
@Entity
@Table(name = "ER_BASE")
@org.hibernate.annotations.Table(appliesTo = "ER_BASE", comment = "报销单信息表")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class ErBase extends BsBase {
@Id
@Column(length = 90)
private String bsId;
// 补助报销明细集合
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "BSID")
@OrderBy("inOrder")
private Set<ErNoBillItem> erNoBillItems = new HashSet<ErNoBillItem>();}}
这样取数我知道,我想要的是取数据库的数据的shuodehao