使用HttpServlet作为唯一入口点提供JSP

时间:2015-05-24 04:00:18

标签: java jsp servlets

我有一个带有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一样。

1 个答案:

答案 0 :(得分:0)

将您的网址格式更改为

$content = file_get_contents("//defconwarningsystem.com/current/defcon.jpg");

这是后备模式。如果容器找不到与其他映射的servlet的任何其他匹配,它将回退到这个。

大多数(如果不是全部)servlet包含寄存器<url-pattern>/</url-pattern> ,它使用模式处理JSP

Servlet

这将在您<url-pattern>*.jsp</url-pattern> 之前匹配。