我有一个带有JSP的Java EE站点,使用MVC架构进行设置。我有一个指向模型对象的servlet,我选择了一个servlet,即NewspaperServlet,它是HTTP请求的唯一入口点。从那里,我必要时调用我的其他servlet。我希望拥有RESTful网址,因此http://myurl/提供/index.jsp,http://myurl/article/1提供/article.jsp,文章对象ID为1,依此类推。
我正好处理路径,但是当实际服务我的JSP页面时,我会将自己重定向到我的代码中,因为我尝试检索/比如/ index。 jsp,因为我的代码是唯一的入口点,然后调用我的代码来查找如何服务/index.jsp!我是应该打算打开我的文件并输出内容,还是有更明智的方法呢?
的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>wsd-newspaper</display-name>
<welcome-file-list>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>JSP Web Service</servlet-name>
<servlet-class>
merus.newspaper.NewspaperServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JSP Web Service</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
NewspaperServlet.doGet():
public void doGet( HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String pathInfo = request.getPathInfo();
request.setCharacterEncoding("UTF-8");
response.setHeader("Content-Type", "text/html");
//index
if (pathInfo.equalsIgnoreCase("/")) {
request.setAttribute("articleList", controller.getIndex());
RequestDispatcher dp = request.getRequestDispatcher("/index.jsp");
dp.forward(request, response);
}
//article servlet redirect
if (pathInfo.startsWith("/article") ||
pathInfo.startsWith("/archive")) {
articleServlet.doGet(request, response);
return;
}
//author servlet redirect
if (pathInfo.startsWith("/author")) {
authorServlet.doGet(request, response);
return;
}
if (pathInfo.startsWith("/logout")) {
request.getSession().removeAttribute("user");
}
RequestDispatcher dp = request.getRequestDispatcher("/404.html");
dp.include(request, response);
}
注意:由于我需要使用的模型的特殊性,我想要非常小心我不加载它两次。 NewspaperServlet创建并初始化其他servlet,因此它也可以是加载模型的唯一类。
控制器与servlet分开。控制器旨在用于提供Web服务,这将需要web.xml中的另一个端点。我并不依赖于拥有一个端点,就像我想要RESTful URL一样。
答案 0 :(得分:0)
将您的网址格式更改为
$content = file_get_contents("//defconwarningsystem.com/current/defcon.jpg");
这是后备模式。如果容器找不到与其他映射的servlet的任何其他匹配,它将回退到这个。
大多数(如果不是全部)servlet包含寄存器<url-pattern>/</url-pattern>
,它使用模式处理JSP
Servlet
这将在您<url-pattern>*.jsp</url-pattern>
之前匹配。