您现在的位置是:休闲 >>正文
javaweb应用程序开发中文件包含的方法有哪些
休闲1413人已围观
简介Servlet里用RequestDispatcher.include()是最常见的一种。它把另一个资源的输出直接嵌到当前响应里,适合做页面布局——比如每个页面都要显示导航栏,那就把header.jsp ...
Servlet里用RequestDispatcher.include()是应用程最常见的一种。它把另一个资源的序开输出直接嵌到当前响应里,适合做页面布局——比如每个页面都要显示导航栏,发中法那就把header.jsp包含进来。文件注意include之后响应对象还是包含原来的,被包含的应用程Servlet不能改状态码或响应头,设了也白设。序开
forward跟include长得很像,发中法但行为完全不同。文件forward是包含控制权转移,当前Servlet停下来,应用程目标资源接着处理,序开浏览器地址栏不变。发中法很多人刚学的文件时候分不清这两个,我在项目里见过有人用forward做页面片段复用,包含结果整个响应被目标页面接管,前面的输出全丢了。记住一点:include是拼进来,forward是交出去。
JSP层面有静态包含和动态包含两种。静态包含写<%@ include file="xxx.jsp" %>,编译时就把目标文件的内容合并进来,合成一个Servlet。动态包含用<jsp:include page="xxx.jsp" />,运行时才调用目标页面,各自编译成独立的Servlet。静态包含快,但有个坑:两个文件里不能有同名变量,因为合并后就是一个文件。动态包含灵活,传参也方便,用<jsp:param>就能带参数过去。
JSTL标签库里的<c:import>也值得提一句。它比JSP的include更强大,不光能包含本应用内的页面,还能包含外部URL的内容。有次我需要在一个页面里嵌入另一个系统的公告栏,用<c:import url="http://other-system/notice.jsp" />直接搞定,不用写任何Java代码。它还能把包含的内容存到变量里,需要的时候再输出,这个特性做缓存挺有用。
Spring MVC项目里,ViewResolver本身就是一种包含机制。返回"common/header"这样的视图名,框架帮你把对应模板渲染进来。Thymeleaf的话用th:insert或th:replace,前者保留自己的标签,后者直接替换掉。Freemarker用<#include>或<#import>,import还能引入宏定义。这些模板引擎的包含逻辑大同小异,但语法细节得查文档,记混了编译就报错。
还有一种是ServletContext.getRequestDispatcher(),跟request.getRequestDispatcher()的区别在于前者只能传绝对路径,后者可以传相对路径。实际开发中很少直接用,因为框架都封装好了。但排查问题时如果看到奇怪的包含行为,翻到这一层能帮你定位。
文件包含用不好会出安全问题。如果包含的路径来自用户输入,攻击者可能构造../../WEB-INF/web.xml这样的路径读到敏感文件。JSP的静态包含是编译期的,相对安全;动态包含和c:import要小心路径拼接。我见过一个老系统用request.getParameter("page")直接拼到include路径里,后来被扫出任意文件读取漏洞,修的时候把所有包含路径改成白名单映射才过审。
选哪种方式取决于场景。页面布局复用优先用JSP include或模板引擎的片段包含;需要嵌入外部内容用c:import;Servlet间协作看是要拼输出还是转移控制权。没有万能方案,搞清楚每种方法的边界条件比背API重要。
Tags:
上一篇:怎么自己搭建一个网站
下一篇:工作落实不力通报批评
相关文章
求职者会问的问题20个
休闲面试官最怕的不是答不上来的求职者,而是那些问出“你们公司是做什么的”的人。我见过HR在听到这个问题时,脸上瞬间浮现的那种复杂表情——三分无奈,七分想结束面试。 反过来,求职者也怕。怕问得太尖锐显得难搞 ...
【休闲】
阅读更多甘肃甘南2022煤炭采购项目
休闲甘肃甘南的煤炭采购,2022年那会儿,价格像过山车。年初坑口价还趴在每吨六百上下,到了三季度,直接蹿上九百,个别高热值煤种甚至摸过千元大关。这不是供需的简单波动,是物流、政策、天气三股绳子拧在一起使劲 ...
【休闲】
阅读更多云南科普实验室工程有限公司
休闲云南的雨季来得又急又密。那天下午,我站在昆明高新区一栋灰白色大楼的走廊里,隔着玻璃窗看见实验室里几台离心机正嗡嗡转着,操作台前穿白大褂的年轻人头也不抬,笔尖在记录本上划出沙沙声。这里就是云南科普实验室 ...
【休闲】
阅读更多