Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java-servlets-在基类中设置编码和会话?_Java_Session_Inheritance_Encoding_Servlet 3.0 - Fatal编程技术网

java-servlets-在基类中设置编码和会话?

java-servlets-在基类中设置编码和会话?,java,session,inheritance,encoding,servlet-3.0,Java,Session,Inheritance,Encoding,Servlet 3.0,我在一个servlet站点上爬行,在几乎每一个doPost中我都会遇到这样的代码: @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // set encoding to UTF-8 if (request.getCharacterEncoding() ==

我在一个servlet站点上爬行,在几乎每一个doPost中我都会遇到这样的代码:

@Override
protected void doPost(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // set encoding to UTF-8
    if (request.getCharacterEncoding() == null)
        request.setCharacterEncoding("UTF-8");
    // TODO : this may be needed in doGet too ?????????
    response.setCharacterEncoding("UTF-8");

    // check if session exists
    boolean sessionExists = request.isRequestedSessionIdValid();
    HttpSession session = request.getSession();

    if (!sessionExists)
        session.setMaxInactiveInterval(1000);

    // if session does not exist we create it
    ServletContext context = session.getServletContext();
    Integer numSessions = (Integer) context
            .getAttribute("numberOfSessions");
    if (numSessions == null)
        context.setAttribute("numberOfSessions", 1);
    else if (!sessionExists)
        context.setAttribute("numberOfSessions", ++numSessions);
}
创建一个BaseController类并将此代码移动到那里是一个好主意吗?我应该在init()方法或doPost()中移动它,然后调用
super.doPost
?还有像session.setAttribute(“photo”,photo)这样的行在一些servlet中。那么在BaseController中有一个
会话
字段是不是一个好主意?如果我理解正确的话,这个字段应该是不稳定的

我对这一切都不熟悉


谢谢

您可以将请求字符编码设置移动到帮助器方法,并从doPost调用它。另外,如果编码设置为utf-8以外的值,请检查代码的行为是否正确

另一方面,会话内容有点奇怪。如果要跟踪会话的数量,请删除所有会话并使用javax.servlet.http.HttpSessionListener。它更加优雅,您将在一个地方拥有您的代码

如果需要跟踪属于会话的变量,请继续使用HttpSession类,不要将它们保存在控制器的字段中。

您应该使用

例如:

public abstract class BaseController extends HttpServlet {

public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    if (request.getCharacterEncoding() == null) {
        request.setCharacterEncoding("UTF-8");
    }
    response.setCharacterEncoding("UTF-8"); [...]

    doService(request, response);
}

protected abstract void doService(HttpServletRequest request, HttpServletResponse response) throws Exception, Error;
}


然后您必须扩展BaseContoller类,实现doService(或其他)方法。

谢谢-我的意思是拥有一个
HttpSession volatile会话字段-并调用
HttpSession session=request.getSession()。这样看起来更优雅,但在servlet编程中可能不是一个好主意?我(目前)还不知道会话的
numberOfSessions
是干什么的-它不是我的代码-我将研究javax.servlet.http.HttpSessionListener。您不需要将会话作为控制器中的字段,servlet容器会处理这个问题。它提供但不提供字段-只有一个方法(
getSession()
)。因此,我们的想法是让所有初始化都在BaseController的doPost或init()中进行。您可以使用前面提到的HttpSessionListener初始化会话内的属性。尝试了HttpSessionListener-很遗憾,重新部署时未触发侦听器-看一看,您能详细说明一下吗?也许这就是我想做的(BaseController是“模板”)。谢谢-显然,侦听器和过滤器是一条路要走。不过这个服务方法很好-应该是类似smth的:
//设置编码;超级服务(请求、响应)