娱乐

strust框架

时间:2010-12-5 17:23:32  作者:时尚   来源:焦点  查看:  评论:0
内容摘要:```html 第一次把Struts2的jar包拖进WEB-INF/lib的时候,我盯着那堆依赖发愣——commons-fileupload、ognl、freemarker,像拆开一台老式收音机,零件

```html

第一次把Struts2的框架jar包拖进WEB-INF/lib的时候,我盯着那堆依赖发愣——commons-fileupload、框架ognl、框架freemarker,框架像拆开一台老式收音机,框架零件散了一桌。框架这框架不轻,框架但它确实把MVC那套东西捏得挺顺手。框架

核心就一个过滤器:StrutsPrepareAndExecuteFilter。框架你把它配在web.xml里,框架所有请求先过它。框架它干两件事——把请求URL映射到某个Action类的框架方法上,再把结果(通常是框架一个字符串)交给对应的JSP或FreeMarker模板。Action不是框架Servlet,是框架个普通Java类,方法返回"success"就跳success.jsp,返回"input"就回表单页。这种约定比写一堆if-else转发清爽得多。

值栈(ValueStack)是Struts2里最值得琢磨的东西。它像个临时货架,Action的属性、请求参数、session数据都往上摆。OGNL表达式从货架上取东西,<s:property value="user.name"/>这种标签直接读值栈,不用request.getAttribute。我第一次用的时候觉得挺神奇,后来发现调试时得盯着控制台看值栈内容,不然属性名写错了页面就空白,也不报错。

拦截器栈是另一个关键。Struts2把参数注入、类型转换、校验、文件上传都做成了拦截器,串在Action执行前后。比如你写个private int age;,表单传age=abc,类型转换拦截器会直接给你个错误,不用自己写try-catch。但这也意味着你得理解拦截器顺序——参数拦截器在校验拦截器之前,校验拦截器又在Action之前。配错了顺序,校验拿到的就是空值。

我见过一个项目把Struts2当Servlet用,Action里塞满业务逻辑,每个方法都返回null然后自己拿response写输出。这等于买了台洗衣机却用来搓衣板。Struts2的定位是请求调度和视图渲染,业务逻辑该放Service层。它的Action天生适合做参数收集和结果映射,别让它干别的。

安全方面踩过坑。早期版本有OGNL表达式注入漏洞,攻击者构造%{ ...}就能执行系统命令。后来官方加了struts.ognl.allowStaticMethodAccess=false这类开关。用Struts2得盯着版本更新,2.3.x和2.5.x的配置差异不小。我习惯在struts.xml里开devMode调试,上线前一定关掉——它会暴露堆栈和配置信息。

配置文件写起来啰嗦。struts.xml里每个Action都要配class、method、result,项目大了就是几百行。有人用Convention插件按约定自动映射,Action类名以Action结尾、方法名默认execute,能省不少事。但团队里新人多的时候,显式配置反而好维护——至少搜索"loginAction"能直接定位到配置行。

结果类型不止JSP。json结果类型配合@JSON注解能直接返回JSON给前端,redirectAction做重定向,stream处理文件下载。我做过一个导出Excel的功能,Action方法返回InputStream,结果类型配stream,参数里指定contentDisposition和bufferSize,浏览器就弹下载框了。比手写response.setHeader省心。

现在新项目很少选Struts2了,Spring MVC更轻更灵活。但维护老系统时绕不开它。我的经验是:别试图改造它,按它的规矩来。值栈该用就用,拦截器该配就配,OGNL别写太复杂的表达式。遇到诡异问题时先看struts.devMode下的日志,十有八九是拦截器顺序或者值栈属性名对不上。这框架像台老式手动挡汽车,开顺了也有它的乐趣——至少你知道每个档位在干什么。

```
最近更新
热门排行
copyright © 2026 powered by 烟消火灭网   sitemap