public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {    final javax.servlet.jsp.PageContext pageContext;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;
}jsp转换成servlet以后,会自动生成以上代码,其中service方法的参数request和response都是final的,请问这么做有什么好处呢?为什么servlet里面的request和response不是final呢?

解决方案 »

  1.   

    声明了final 那么这个变量的引用就不会被修改了,从功能上说没有什么区别,可以避免恶意的攻击也可以避免自己无意的不小心重新修改的引用。如果你用PMD这个玩意去分析你的代码,这种地方他都是会有警告的,推荐你加上final。
      

  2.   

    可是为什么servlet自己的实现里却没有用final关键字来修饰request和response参数呢?请大家随便说几句吧,以便结贴,就当散分了
      

  3.   

    session和application级别变量会有线程安全问题。java默认在final变量上有特殊检查,加上final之后不必担心线程安全中的变量可见性问题。
      

  4.   


    奇怪的是,为什么jsp翻译的servlet中request参数会加final修饰,而原本正统serlet却没有呢??
      

  5.   

    又可以确保jsp中内置对象不被更改。可以一举多得。而自己的Servlet代码中,由于session和application都是通过get方法取得的。request对象中已经对其final了。所以问题也不大。为了解决线程安全问题。有个典型的应用在ibatis的sample,formstruts里。里面的代码用ThreadLocal封装了request, response, session和application。道理和final一样