将后台数据存放入Application域中

本文介绍了一种优化前端页面加载速度的方法,通过将不常更新的静态数据如菜单、链接等存储在Application中,避免了每次刷新页面时重复访问数据库,减轻了数据库压力,提高了用户体验。

前端页面的head、menu、foot … 的数据,这些数据并不会经常更新,而数据是存放在数据库中,如果每次刷新都去访问数据库,则会给数据库带来压力,所以将这些数据放入Application中,代码如下:

/**
 * 初始化组件
 */
@Component("initComponent")
public class InitComponent implements ServletContextListener,ApplicationContextAware{

	private static ApplicationContext applicationContext;
	
	public void refreshSystem(ServletContext application)
		ArcTypeService arcTypeService=(ArcTypeService) applicationContext.getBean("arcTypeService");
		List<ArcType> arcTypeList=arcTypeService.list(null); // 查询所有帖子类型
		application.setAttribute("arcTypeList", arcTypeList); 
		
		LinkService linkService=(LinkService) applicationContext.getBean("linkService"); // 查询所有友情链接
		List<Link> linkList=linkService.list(null);
		application.setAttribute("linkList", linkList);
		
		ArticleService articleService=(ArticleService) applicationContext.getBean("articleService");
		List<Article> newestArticleList=articleService.getNewest(); // 获取最新7条帖子
		application.setAttribute("newestArticleList", newestArticleList);
		
		List<Article> recommendArticleList=articleService.getRecommend(); // 获取最新7条推荐的帖子
		application.setAttribute("recommendArticleList", recommendArticleList);
		
		List<Article> slideArticleList=articleService.getSlide(); // 获取最新5条幻灯帖子
		application.setAttribute("slideArticleList", slideArticleList);
	}
	
	public void contextInitialized(ServletContextEvent servletContextEvent) {
		ServletContext application=servletContextEvent.getServletContext();
		refreshSystem(application);
	}

	public void contextDestroyed(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		
	}

	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext=applicationContext;
	}

同时在web.xml中要添加监听。

   <listener>  
        <listener-class>com.thr.service.impl.InitComponent</listener-class>  
    </listener

然后就可以在前台页面拿到相应的数据了。
如果要刷新一下Application中的数据(一般在添加、修改、删除的Controller写入)代码如下:
要在对应的Controller中加Bean。

    @Autowired
	private InitComponent initComponent;

这里用一个删除做为例子:

/**
	 * 删除友情链接信息
	 * @param ids
	 * @param response
	 * @return
	 * @throws Exception
	 */
	@RequestMapping("/delete")
	public String delete(@RequestParam(value="ids")String ids,HttpServletResponse response)throws Exception{
		String []idsStr=ids.split(",");
		JSONObject result=new JSONObject();
		for(int i=0;i<idsStr.length;i++){
			linkService.delete(Integer.parseInt(idsStr[i]));				
		}
		// 刷新系统缓存
	    initComponent.refreshSystem(ContextLoader.getCurrentWebApplicationContext().getServletContext()); 
		result.put("success", true);
		ResponseUtil.write(response, result);
		return null;
	}
<think>好的,我现在需要解决用户关于JavaWeb中EL达式${}导致数据空白的问题。首先,我得回想一下自己对EL达式的了解,并结合用户提供的引用内容来分析可能的原因。用户提到使用${}时数据不显示,可能的原因有很多。首先,根据引用[1]和[2],EL达式主要用于从web中检索数据,如果作用中没有对应的属性,或者属性名写错了,就会导致空白。例如,用户可能在Servlet中设置了一个名为"student"的对象,但在JSP中拼写成了"studen",这时候EL达式就会找不到值。然后,考虑EL达式是否被禁用了。引用[2]提到,EL达式是JSP2.0加的,如果web.xml配置的是较旧的Servlet版本,比如2.3以下,默认会禁用EL。这时候需要检web.xml的声明,或者通过page指令设置isELIgnored为false。用户提供的引用[3]中的示例代码里,确实有正确的使用方式,比如${student.name},所以需要确认是否在页面顶部有<%@ pageisELIgnored="false" %>这样的设置。 第三个可能性是作用的问题。EL达式默认按照page→request→session→application的顺序找属性。如果数据存放在request作用里,但在转发过程中丢失,比如使用了重定向而不是转发,那么数据就不会被带到JSP页面,导致EL无法获取。这时候需要检Servlet中是使用request.getRequestDispatcher().forward()还是response.sendRedirect(),后者会导致request作用数据丢失。 接下来,属性值为null的情况。根据引用[3],EL达式遇到null时会显示为空字符串,但如果是整个对象不存在,比如没有在作用中放student对象,那么${student.name}也不会显示任何内容。这时候需要检后台是否正确设置了属性,比如request.setAttribute("student", studentObj)。另外,EL达式无法访问私有成员,除非有对应的getter方法。比如,student对象的name属性必须有getName()方法,否则EL达式无法通过${student.name}获取值。用户可能忽略了这一点,直接访问了字段而不是通过getter,这会导致空白。 还有可能涉及EL达式的保留字或特殊字符,比如属性名与JSP关键字冲突,或者使用了不支持的运算符。不过这种情况相对少见,但需要检属性名是否符合命名规范。最后,考虑是否有过滤器或拦截器修改了请求属性,或者在JSP页面中存在其他脚本代码覆盖了EL达式的结果。例如,用户可能在JSP中使用了<%%>脚本块重新设置了变量,导致EL达式获取的值被覆盖。 总结下来,可能的解决步骤包括:检作用中是否存在属性、确认EL达式未被禁用、检属性命名和getter方法、确保使用正确的请求转发方式,以及验证属性值是否正确设置。此外,服务器日志是否有错误信息,也有助于定位问题。</think>在JavaWeb中使用EL达式`${}`出现数据空白的问题,通常由以下原因及解决方法引起: --- ### 一、常见原因分析 1. **EL达式未启用** - 若`web.xml`配置为Servlet 2.3或更低版本(如`<!DOCTYPE web-app PUBLIC ... 2.3">`),默认禁用EL达式[^2]。 - **解决方法**: - 升级`web.xml`为Servlet 2.4+版本; - 或在JSP页面顶部添加`<%@ page isELIgnored="false" %>`[^2]。 2. **作用中无对应属性** - EL达式默认从`page→request→session→application`作用找属性。若未正确设置作用或属性名错误,则返回空字符串[^1][^3]。 - **示例**: ```java // Servlet中设置属性 request.setAttribute("student", studentObj); ``` ```jsp <!-- JSP中正确使用 --> ${student.name} <!-- 需确保studentObj有getName()方法 --> ``` 3. **属性值为null或未定义** - EL达式对`null`值会显示空字符串,但若属性未定义(如未通过`setAttribute`设置),则直接不输出[^3]。 4. **缺少getter方法** - EL达式依赖JavaBean的`getXxx()`方法访问属性。若未定义`getName()`方法,`${student.name}`将无法获取值[^1][^3]。 5. **请求转发方式错误** - 使用`response.sendRedirect()`(重定向)会导致`request`作用数据丢失,应改用`request.getRequestDispatcher().forward()`(转发)[^3]。 --- ### 二、调试与验证步骤 1. **检EL达式是否生效** - 在JSP中添加测试代码:`${1 + 1}`,若输出`2`,则EL已启用;否则需检配置[^4]。 2. **输出作用内容** - 使用`<%= request.getAttribute("student") %>`(脚本达式)确认属性是否存在于作用中。 3. **服务器日志** - 检是否有`PropertyNotFoundException`或`EL解析错误`,定位属性访问问题。 4. **简化达式测试** - 逐步替换复杂达式,如先测试`${student}`是否输出对象地址,再测试`${student.name}`。 --- ### 三、代码示例对比 **错误示例**(属性未设置): ```java // Servlet中未设置student属性 request.getRequestDispatcher("/el_info.jsp").forward(request, response); ``` ```jsp <!-- JSP中 --> ${student.name} <!-- 空白 --> ``` **正确示例**: ```java // Servlet中设置属性 Student student = new Student("张三"); request.setAttribute("student", student); request.getRequestDispatcher("/el_info.jsp").forward(request, response); ``` ```jsp <!-- JSP中 --> ${student.name} <!-- 输出"张三" --> ``` --- ### 四、高级排 - **使用`pageContext`调试**: 通过`${pageContext.request.contextPath}`等内置对象验证EL功能[^5]。 - **检过滤器干扰**: 某些过滤器可能清空`request`作用数据,需检过滤链逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值