标签归档:struts

Struts 获取request中inputStream的问题

问题:如果使用了Struts2,如下代码提交的http post请求会获取不到数据

    ...
    url = new URL(path);
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);
    OutputStream os = conn.getOutputStream();
    os.write(param.getBytes(charsetName));
    os.flush();
    os.close();
    input = conn.getInputStream();
    ...

Struts2中的读取代码如下:

    ...
    ServletInputStream is = request.getInputStream();
    String result = TohoursUtils.inputStream2String(is);
    super.printToHtml("result:" + result);
    ...

这样调用一直会出现空白,但使用POSTMAN调用会打出结果,什么原因?

于是使用wireshark查了一下,http请求默认使用Content-Type: application/x-www-form-urlencoded,而POSTMAN由于提交的都字符串,所以使用的是Content-Type: plain/text,于是在OutputStream write前,增加conn.setRequestProperty("Content-Type", "plain/text");就可以了

原因:是由于Struts拦截了所有的http请求,如果是x-www-form-urlencoded则要处理成Action变量;这就是说Struts框架中已经将inputStream读走了,而inputStream只能读一次,所以后面就读取不到了

struts标签include页面不能显示

使用struts2标签<s:include value=”bottom.jsp” />始终不能显示,但上面的<s:include value=”top.jsp” />能够正常显示,让我查了好久,原来是在bottom.jsp使用了一个标签,但语法错了,将value写成了vlaue,所以不能正常加载

这个错误浪费了我至少30分钟时间

convention-plugin struts2 零配置

相对于是其他语言来说,java的轮子实在太多了,好用的不好用的一股脑的全部上来。能用的不能用了,只要你用在了你的项目里面,就说明你牛B。struts + spring + hibernate虽然已经成为现在java开发的主流,但我却一点也不敢苟同,其学习成本高,开发效率低下,开发出来的东西速度没保证,安全性也不能得到明示提高,实在搞不明白,因为一个小功能,其他语言一天能搞定的事情,要花一周的时间拱框架,再花一周的时间开发,开发出来的功能经过测试性能又达不到!

我们现在关注的地方应该有所转变了,我认为主要有两点需要提高,中间跳来跳去的环节都免了吧:

1、提高安全性,无论数据库注入的安全性,还是XSS跨站的安全性,在开发中应该让我们多注意这些方面的东西。

2、提高用户使用的舒适度,UI的提升也是必不可少的一个环节。

也许很多人会说,没框架不能协同,没框架不能很好完成大型项目开发,但我觉得,只要有一套良好的代码规范,并且所有开发人员都按照这个规范去做,无论用什么语言,开发多么大型的项目,所得到的结果都是良好的。为了代码的安全性与可回溯性,版本控制软件也必不可少。

今天接后一同事的项目,要在这个项目上改造成另外一个项目,并提供给别人使用,SSH框架,理论上来说整个开发过程应该还是比较熟悉的,唯一不知道的是他使用了convention-plugin实现struts的零配置,0配置就代码你使用默认配置,这就导致了我在配置文件里面找不到他页面跳转的路径。当然,查看他的jsp主目录很快就能看出其中的规律,但不知道他的默认配置写到那个地方还是让我心里有点不舒服。

于是google了一下其默认路径WEB-INF/content才知道,原来这是convention-plugin的功能,其配置当然在其jar包里,对开发人员是透明的,当然你也可以在struts.xml里面修改其默认配置。