2010-09-16 65 views
5

下面的URL,所選答案中的第一個內容描述JSP隱藏。隱藏JSP頁面不能直接訪問,但是如何訪問目標頁面?

Hidden features of JSP/Servlet

我至今明白,我可以把JSP文件/ WEB-INF目錄下。因此,它可以防止用戶像http://test.com/WEB-INF/register.jsp(返回404)

直接訪問我認爲我理解但不是,並希望更好地描述,所以我打開這裏的問題。

我有,比如下面的2個jsp文件。

的webapps/ROOT /針對home.jsp

的webapps/ROOT/WEB-INF/register.jsp

注:/go_register是在web.xml映射到servlet類Register(DD)

回到Home.jsp

<html> 
<body> 
    <a href="/go_register">Go to register.jsp</a> 
<body> 
</html> 

register.jsp

<html> 
<body> 
    <form method="post" action="/process_register"> 
    <input type="submit"> 
</form> 
<body> 
</html> 

所以..因爲register.jsp駐留在/ WEB-INF /只的RequestDispatcher可以訪問它。 這意味着我需要創建servlet來轉發請求。

public class Register extends HttpServlet { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String address = "/WEB-INF/register.jsp"; 
     request.getRequestDispatcher(address).forward(request, response); 
    } 
} 

但這看起來不對。如果我想添加登錄頁面/WEB-INF/login.jsp到home.jsp, 爲了訪問login.jsp,我必須創建另一個servlet 只是爲了進入登錄頁面目的? ??

public class Login extends HttpServlet { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     String address = "/WEB-INF/login.jsp"; 
     request.getRequestDispatcher(address).forward(request, response); 
    } 
} 

我想我以錯誤的方式使用該技術。任何人都可以解釋如何使用這個jsp隱藏?

回答

4

你確實有一個Servlet在doPost()方法中執行登錄任務嗎?你可以只添加必要的doGet()它:)

順便說一句,我只想映射Register的servlet在單一url-pattern/register,這樣就可以在這兩個<a href="/register">使用它(這將調用doGet()法)和<form action="/register" method="post"> (這將調用doPost()方法),而不需要兩個servlet映射。

爲了更進一步,您可以將這一切重構爲一個servlet,根據請求URL進行相應的操作。如你所見,有一些代碼可以被抽象出來。通常,這是由Struts2,Spring-MVC,JSF2等MVC框架完成的,但您也可以自己創建一個基本框架。更多的細節和代碼示例可以在this answer中找到。

+0

前端控制器模式似乎是滿足我需求的方式。我想過集中入門點,但從來沒有想過這種模式,感謝鏈接! – 2010-09-17 10:43:16

1

是的,沒錯。通常使用框架比較容易,比如struts或spring。

+1

我認爲使用框架會更容易,但是我沒有使用任何框架,所以需要一些東西來寫自己,謝謝你的提示。 – 2010-09-18 01:34:06