【问题标题】:How to properly import a pure simple servlet in a JSF Spring config environment?如何在 JSF Spring 配置环境中正确导入纯简单的 servlet?
【发布时间】:2014-07-07 09:13:59
【问题描述】:

我有一个使用 JSF 和 Spring 开发的项目。

我的实习生必须创建一种“网络服务”来返回 json,他使用该 json 来使用 ajax/jquery 查询制作一些图形。

We read jsf 并不是制作 Web 服务风格应用程序的最佳材料。我们让它与 jsf 一起工作,但我们了解到最好的方法是制作一个简单的 servlet 或使用 JAX-RS。

为了尽可能简单,并使其理解基础,我们通过一个简单的 servlet 类。

所以我们只在web.xml中配置

  <servlet>
  <servlet-name>ServletNormal</servlet-name>
  <servlet-class>com.clb.genomic.lyon.beans.ServletNormal</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>ServletNormal</servlet-name>
  <url-pattern>/ServletNormal.do/*</url-pattern>
   </servlet-mapping>

然后是实习生一个简单的垃圾代码来测试:

public class ServletNormal extends HttpServlet{


    private static final long serialVersionUID = 123L;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // TODO Auto-generated method stub
          request.setCharacterEncoding("UTF-8");
          response.setCharacterEncoding("UTF-8");
          response.setContentType("application/json"); 


        String paramAuteur = request.getParameter( "projet" );
            String message= ""; 
           // Test with harcoded json

            if(paramAuteur.equals("Profile")) {
                message = "{\"value\":[23,58,87,115],\"Categorie\":[\"1-2013\",\"2-2013\",\"3-2013\",\"4-2013\"]}" ;                  
            }
            else if(paramAuteur.equals("Fake1")){
                message = "{\"value\":[23,58,87,115,141,173,203],\"Categorie\":[\"1-2013\",\"2-2013\",\"3-2013\",\"4-2013\",\"5-2013\",\"6-2013\",\"7-2013\"]}" ;                 
            }
            else{
                message = "{\"value\":[23,58,87,115,141,173,203,227,245,262,277,300],\"Categorie\":[\"1-2013\",\"2-2013\",\"3-2013\",\"4-2013\",\"5-2013\",\"6-2013\",\"7-2013\",\"8-2013\",\"9-2013\",\"10-2013\",\"11-2013\",\"12-2013\"]}" ;               
            }

        PrintWriter out = response.getWriter(); 

        out.print(message);

    }
}

然后在 ajax/jquery 中,我们将 servlet 称为:/ServletNormal.do/?projet=Profile 以获取用于图形绘制的 json。

这很好用......但可以肯定的是,这种方法是否干净(硬编码 Json 除外)?还是它很脏,我们不应该这样做?有没有更好的办法?

【问题讨论】:

    标签: java spring web-services jsf-2 servlet-3.0


    【解决方案1】:

    我看不出它有什么问题,但是如果您正在创建一个 web 服务,最好使用 JAX-RS(例如使用 Jersey),因为您可以利用对 Restful URL 的开箱即用支持 -我认为设置起来也不是非常复杂,尤其是在像 Tomcat 7 这样的 Servlet 3.0 容器中。

    【讨论】:

      【解决方案2】:

      JSF 与您声明的任何其他 Servlet 兼容,只要您注意地址模式。一个典型的 JSF 2.x servlet 配置是:

      <servlet>
          <servlet-name>Faces Servlet</servlet-name>
          <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
          <load-on-startup>1</load-on-startup>
      </servlet>
      
      <servlet-mapping>
          <servlet-name>Faces Servlet</servlet-name>
          <url-pattern>*.xhtml</url-pattern>
      </servlet-mapping>
      

      它将任何.xhtml 结束的请求映射到JSF Servlet。但是,您可以将任何其他技术用于您的 Web 服务。我个人倾向于使用 Spring MVC 来实现 RESTful 服务。我这样声明:

      <servlet>
          <servlet-name>REST Servlet</servlet-name>
          <servlet-class>org.springframework.web.servlet.DispatcherServlet
          </servlet-class>
          <init-param>
              <param-name>contextConfigLocation</param-name>
              <param-value>/WEB-INF/rest-servlet.xml</param-value>
          </init-param>
          <load-on-startup>1</load-on-startup>
      </servlet>
      
      <servlet-mapping>
          <servlet-name>REST Servlet</servlet-name>
          <url-pattern>/service/*</url-pattern>
      </servlet-mapping>
      

      这样,我让所有 /service/* 类型的请求都由我的 Spring MVC REST servlet 处理。同样的,Spring 也有很好的 JAX 和 CXF 集成,所以你不必定义自己的 Servlet。

      总之,不要为这样的工作重新发明轮子。

      另请参阅:

      【讨论】:

        猜你喜欢
        • 2019-12-27
        • 2019-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-06
        • 2014-12-01
        • 1970-01-01
        • 2021-12-04
        相关资源
        最近更新 更多