2

私はサーブレットサイトをクロールしていて、ほとんどすべての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);、一部のサーブレットのような行もあります。その場合、BaseControllerにフィールドを設定することをお勧めしますsession。これは、私が正しく理解していれば、揮発性である必要があります。

私はこれらすべてに不慣れです。

ありがとう

4

2 に答える 2

3

テンプレートパターンを使用する必要があります。

例:

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(またはその他)メソッドのみを実装する必要があります。

于 2012-07-18T17:23:17.267 に答える
2

リクエスト文字エンコードの設定をヘルパーメソッドに移動して、doPostから呼び出すことができます。また、エンコーディングがutf-8以外に設定されている場合は、コードが正しく動作するかどうかを確認してください。

一方、セッションのものは少し奇妙です。セッション数を追跡したい場合は、それをすべて削除し、javax.servlet.http.HttpSessionListenerを使用してください。よりエレガントで、コードを1か所にまとめることができます。

セッションに属する変数を追跡する必要がある場合は、HttpSessionクラスを引き続き使用し、コントローラーのフィールドに保存しないでください。

于 2012-07-18T17:22:49.787 に答える