2010-09-16 67 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