我正在开发一个JSP / Servlet Web应用程序(没有框架).我想使用MVC模式.我打算像这样设计我的项目: Controller:一个servlet,它读取请求,提取值,与模型对象通信并向JSP页面提供信息. 查看:J
> Controller:一个servlet,它读取请求,提取值,与模型对象通信并向JSP页面提供信息.
>查看:JSP页面.
>模型:Java类/ Java Bean等.等
问题:Index.jsp是我网站的起点(默认页面).因此,Index.jsp成为解析请求的控制器.例如,以下请求:
index.jsp?section=article&id=10
在index.jsp中解析如下:
<div class="midcol"> <!-- Which section? --> <%String fileName = request.getParameter("section"); if (fileName == null) { fileName = "WEB-INF/jspf/frontpage.jsp"; } else { fileName = "WEB-INF/jspf/" + fileName + ".jsp"; } %> <jsp:include page='<%= fileName%>' /> </div>
在这里,我不能强制servlet成为一个控制器,因为index.jsp是这里的控制器,因为它是起点.
是否有任何解决方案将请求从index.jsp转发到servlet然后返回index.jsp?或任何实现MVC目标的解决方案 – servlet应该是控制器?
我正在考虑将FrontPageController servlet作为默认页面而不是index.jsp,但我不知道它是否是一个完美的主意?
摆脱index.jsp,让控制器servlet监听感兴趣的特定url模式.控制器本身应使用RequestDispatcher将请求转发到感兴趣的JSP页面.request.getRequestDispatcher("/WEB-INF/page.jsp").forward(request, response);
或者,您可以将index.jsp转发或重定向到控制器servlet所覆盖的URL,该控制器servlet又显示“默认”页面(似乎是frontpage.jsp).
也就是说,在正确的MVC方法中,JSP文件中应该没有scriptlet.无论什么时候需要在JSP文件中编写一些原始Java代码,而这些代码无法通过taglibs(JSTL等)或EL合理地替换,那么特定的Java代码在任何方式都属于真正的Java类,如Servlet,过滤器,Javabean等.
关于本土MVC方法,您可能会发现this answer和this article也很有用.