Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Как конфигурировать сервлет в Spring?


Автор: olegrolik 20.5.2008, 17:54
Я хочу, чтобы у меня был сервлет, в котором был реализован get и post запросы. При этом должна быть возможность изменять различные параметры при сборке приложения.
Код

public class HttpsServletTest extends HttpServlet {
    private String prop1;
    
    public void setProp1(String prop1) {
        this.prop1 = prop1;
    }
    public String getProp1() {
        return prop1;
    }
    
    
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException{
        res.setContentType("text/html");
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("<h1>HelloWorld</h1>");
        out.println("<h2>"+prop1+"</h2>");
        out.println("</body>");
        out.println("</html");
        
    }

    
        public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException{
        // later :)
        
    }
    public ModelAndView handleRequest(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        
        return null;
    }
    
}



Делаю так: 
web.xml:
Код

<servlet>
    <servlet-name>manage</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
  </servlet>
 <servlet-mapping>
          <servlet-name>manage</servlet-name>
          <url-pattern>/https/Hey</url-pattern>
      </servlet-mapping>


manage-servlet.xml:
Код

<beans>
    <bean id="httpsServletTest" class="HttpsServletTest">
        <property name="prop1">
            <value>Property1</value>
        </property>
    
    </bean>
</beans>



при вызове сервлета появляется ошибка :
Код

SEVERE: Servlet.service() for servlet manage threw exception
javax.servlet.ServletException: No adapter for handler [HttpsServletTest@33aa9b]: Does your handler implement a supported interface like Controller?
    at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1086)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:873)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)



Вот.... Что делать?

Автор: Kangaroo 20.5.2008, 19:29
Нужно, чтобы твой класс имплементировал интерфейся Контроллер или наследуй его от АбстрактКонтроллера. 

Автор: olegrolik 21.5.2008, 08:56
Цитата(Kangaroo @ 20.5.2008,  19:29)
Нужно, чтобы твой класс имплементировал интерфейся Контроллер или наследуй его от АбстрактКонтроллера.

Код

public class HttpsServletTest extends AbstractController {
    private String prop1;
    
    public void setProp1(String prop1) {
        this.prop1 = prop1;
    }
    public String getProp1() {
        return prop1;
    }
    
    
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException{
        res.setContentType("text/html");
        System.out.println("doGet!");
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("<h1>HelloWorld</h1>");
        out.println("<h2>"+prop1+"</h2>");
        out.println("</body>");
        out.println("</html");
        
        
    }
    
    public ModelAndView handleRequest(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        System.out.println("12345");
        return null;
    }
    @Override
    protected ModelAndView handleRequestInternal(HttpServletRequest arg0,
            HttpServletResponse arg1) throws Exception {
        // TODO Auto-generated method stub
        return null;
    }
    
}


web.xml:
Код


<servlet>
    <servlet-name>manage</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    
  </servlet>
 <servlet-mapping>
          <servlet-name>manage</servlet-name>
          <url-pattern>/http</url-pattern>
      </servlet-mapping>


Вызываю в браузере localhost:8080/App/http
Но срабатывает метод handleRequest, а не doGet. А мне нужно, чтобы сработал именно doGet.

Автор: Kangaroo 21.5.2008, 09:36
olegrolik
а зачем ты его тогда пускаешь через ДиспатчерСервлет?
Если нужен отдельный сервлет - то просто мапь его в web.xml и наследуй от обычного сервлета.
Если же нужно пускать через ДиспатчерСервлет - то нужно использовать handleRequest, так как именно его вызывает Диспатчер.

Автор: olegrolik 21.5.2008, 09:38
Kangaroo, а мне это нужно для того, чтобы "проперти" разные писать. И в конфигурационном файле их каждый раз менять... 
Вот так, например:

Код

<beans>
    <bean id="httpsServletTest" class="HttpsServletTest">
        <property name="prop1">
            <value>Property1</value>
        </property>
    
    </bean>
</beans>

Очень удобно!

Автор: Kangaroo 21.5.2008, 09:54
Цитата(olegrolik @  21.5.2008,  09:38 Найти цитируемый пост)
Kangaroo, а мне это нужно для того, чтобы "проперти" разные писать. И в конфигурационном файле их каждый раз менять... 

Для этого есть стандартный механизм сервлетов - конфиг параметры в web.xml. А потом в методе init() их разбирать и устанавливать сервлету.

Добавлено через 3 минуты и 1 секунду
Второй вариант - в методе handleRequest или handleRequestInternal написать простой иф - если ГЕТ, то вызвать дуГет, если ПОСТ, то вызвать дуПост.

Автор: fixxer 21.5.2008, 10:01
Есть вариант посередине. 
org.springframework.web.servlet.HttpServletBean
Он воспринимает конфиг параметры в web.xml как спринговые инджекшны.

Автор: Kangaroo 21.5.2008, 10:08
Цитата(fixxer @  21.5.2008,  10:01 Найти цитируемый пост)
Есть вариант посередине. 
org.springframework.web.servlet.HttpServletBean

Красота smile 

Автор: olegrolik 22.5.2008, 12:20
fixxer, правильно ли я понял? Делаю вот так.
web.xml:
Код

<servlet>
    <servlet-name>httpsTest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
<servlet-mapping>
    <servlet-name>httpsTest</servlet-name>
    <url-pattern>/httpsTest</url-pattern>
  </servlet-mapping>


httpTest-servlet.xml:
Код

<beans> 
    
    <bean id="httpsServletTest" class="com.package.HttpsServletTest">
        <property name="prop1">
            <value>Property1</value>
        </property>
        <property name="name">
            <value>Oleg</value>
        </property>    
    </bean>
    
     <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>               
                <prop key="/httpsTest">httpsServletTest</prop>
             </props>
        </property>
    </bean> 
    
</beans>

класс HttpsServletTest:
Код

public class HttpsServletTest extends HttpServletBean {
    private String prop1;
    private String name;
    
    public void setProp1(String prop1) {
        this.prop1 = prop1;
    }
    public String getProp1() {
        return prop1;
    }
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException{
        res.setContentType("text/html");
        System.out.println("doGet!");
        System.out.println(prop1);
        System.out.println(name);
        PrintWriter out = res.getWriter();
        out.println("<html>");
        out.println("<body>");
        out.println("<h1>HelloWorld</h1>");
        out.println("<h2>"+prop1+"</h2>");
        out.println("<h2>"+name+"</h2>");
        out.println("</body>");
        out.println("</html");    
        
    }
    
    public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException{
        // later
    }


    
}



вызываю сервлет так:
http://localhost:8080/MyApplicationName/httpsTest
Ошибка та же.
Код


SEVERE: Servlet.service() for servlet httpsTest threw exception
javax.servlet.ServletException: No adapter for handler [com.package.HttpsServletTest@8518d4]: Does your handler implement a supported interface like Controller?
    at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1086)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:873)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)


Автор: Kangaroo 22.5.2008, 14:32
Цитата(olegrolik @  22.5.2008,  12:20 Найти цитируемый пост)
fixxer, правильно ли я понял? Делаю вот так.

 не-а..  smile  smile 




Цитата(fixxer @  21.5.2008,  10:01 Найти цитируемый пост)
Он воспринимает конфиг параметры в web.xml как спринговые инджекшны. 

Тебе это сервлет не в конфигурации спринга надо прописать, а в веб.ксмл

Добавлено через 1 минуту и 5 секунд
Там же и параметры ему задать, просто эти параметры сами будут биндится к переменным твоего класса

Автор: olegrolik 22.5.2008, 14:42
Цитата(fixxer @ 21.5.2008,  10:01)
Он воспринимает конфиг параметры в web.xml как спринговые инджекшны.

Или это значит, что можно будет так конфигурировать HttpServletBean ?
Код


<context-param>
        <param-name>prop1</param-name>
        <param-value>
            Property1Value
        </param-value>
    </context-param>


Автор: Kangaroo 22.5.2008, 14:50
Цитата(olegrolik @  22.5.2008,  14:42 Найти цитируемый пост)
Или это значит, что можно будет так конфигурировать HttpServletBean ?

Ага, вроде по документации так. Попробуй

Автор: fixxer 22.5.2008, 15:20
Я каждый раз удивляюсь, что людям проще написать в форум и гадать сообща целый день, чем открыть javadoc и английским по белому прочитать:
Цитата

public abstract class HttpServletBean
extends HttpServlet

Simple extension of HttpServlet which treats its config parameters (init-param entries within the servlet tag in web.xml) as bean properties. 


 smile 

Автор: olegrolik 22.5.2008, 15:36
Kangaroo, не увидел твоё сообщение, когда писал своё последнее. Спасибо.
fixxer, спасибо, я всё понял.
Тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)