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


Автор: ShurikA 15.3.2007, 02:21
Каким образом можно создать конфиг для сервлета?

Автор: tux 15.3.2007, 08:38
В каком смысле? Чем стандартные средства описания параметров сервлета в web.xml не устраивают?

Автор: Maksym 15.3.2007, 12:56
ShurikA
расширю ответ tux:
что то типа такого в web.xml подойдет... ? :
Код

    <servlet>
        <servlet-name>Servlet Name</servlet-name>
        <servlet-class>mypackage.MyServlet</servlet-class>
        <init-param>
            <param-name>config_param_1_name</param-name>
            <param-value>config_param_1_value</param-value>
        </init-param>
    </servlet>


Автор: ShurikA 15.3.2007, 15:20
Понял, спасибо!

Автор: superVad 15.3.2007, 15:48
to Maksym: а как эти параметры в сервлете доставать?

Автор: ShurikA 15.3.2007, 16:22
Цитата(superVad @  15.3.2007,  14:48 Найти цитируемый пост)
to Maksym: а как эти параметры в сервлете доставать? 

Если я не ошибаюсь, то:
getInitParameter("param_name");

Автор: superVad 15.3.2007, 16:28
спасиба

Автор: ShurikA 15.3.2007, 16:39
Цитата(ShurikA @  15.3.2007,  15:22 Найти цитируемый пост)
Если я не ошибаюсь, то:
getInitParameter("param_name"); 

но цчего то у менйа у самого это не работает...

Автор: AntonSaburov 15.3.2007, 17:07
Код хорошо бы посмотреть.

Автор: ShurikA 15.3.2007, 17:17
Код

package apisserver;

import dataclasses.DataClasses.PageSubmission;
import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

import apisserver.DBMgr.*;
import dataclasses.DataClasses.AlbumDetails;
import dataclasses.DataClasses.DesignTemplate;
import dataclasses.DataClasses.TemplateData;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */


public class ApisServer extends HttpServlet {
    private static final String TEXT_CONTENT_TYPE = "text/html";
    private static final String OBJECT_CONTENT_TYPE =
            "application/x-java-serialized-object";
    private static final String GET_TMPL_INDEXES = "get_tmpl_indexes";
    private static final String GET_TMPL = "get_tmpl";
    private static final String GET_TEMPLATE = "get_template";
    private static final String GET_ALBUM_DETAILS = "get_album_details";
    
    private Config cfg = null;
    
    //Initialize global variables
    public void init() throws ServletException {
        //load all needed params
        ServletConfig sc = getServletConfig();
        cfg = new Config(sc.getInitParameter("db_url"), 
                sc.getInitParameter("db_user"), sc.getInitParameter("db_pass"));
    }
    
    //Process the HTTP Get request
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        String act = request.getParameter("act");
        
        //check the message
        if(act != null){
            if (act.equals(GET_TMPL_INDEXES)) {
                SendTmplIndexList(request, response);
            } else if (act.equals(GET_TMPL)) {
                SendTemplatePreview(request, response);
            } else if (act.equals(GET_TEMPLATE)) {
                this.SendTemplate(request, response,
                        Integer.parseInt(request.getParameter("tId")));
            } else if(act.equals(GET_ALBUM_DETAILS)){
                this.SendAlbumDetails(request, response, request.getParameter("oId"));
            }
        }else {
            Object obj = GetObject(request);
            if(obj instanceof PageSubmission){
                SendPageSubmissionConfirmation(response, (PageSubmission) obj);
            }
        }
    }
    
    //Process the HTTP Post request
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws
            ServletException, IOException {
        doGet(request, response);
    }
    
    //Clean up resources
    public void destroy() {
    }
    
    private Object GetObject(HttpServletRequest req){
        ObjectInputStream fromApplet = null;
        Object obj = null;
        try {
            fromApplet = new ObjectInputStream(req.getInputStream());
            obj = fromApplet.readObject();
            fromApplet.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        
        return obj;
    }
    
    private void SendObject(HttpServletResponse response, Object obj) {
        ObjectOutputStream outToApplet;
        try {
            response.setContentType(OBJECT_CONTENT_TYPE);
            outToApplet = new ObjectOutputStream(response.getOutputStream());
            outToApplet.writeObject(obj);
            outToApplet.flush();
            
            outToApplet.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    private void SendPageSubmissionConfirmation(HttpServletResponse response, PageSubmission pageSubmission) {
        try {
            
        } catch (Exception ex) {
            ex.printStackTrace();
            pageSubmission.setException(ex);
        }
        
        this.SendObject(response,pageSubmission);
    }
    
    private void SendAlbumDetails(HttpServletRequest request, HttpServletResponse response, String oid){
        AlbumDetails aTmpl = null;
        DBMgr dbMgr = new DBMgr(request, cfg);
        try {
            aTmpl = dbMgr.GetAlbumDetails(oid);
        } catch (Exception ex) {
            ex.printStackTrace();
            aTmpl.setException(ex);
        }
        
        this.SendObject(response,aTmpl);
    }
    
    private void SendTemplate(HttpServletRequest request, HttpServletResponse response, int id) {
        DesignTemplate tmpl = null;
        StringBuffer str = new StringBuffer();
        DBMgr dbMgr = new DBMgr(request, cfg);
        try{
            tmpl = dbMgr.BuildTemplate(id, str);
        }catch (Exception e){
            tmpl.setException(e);
        }
        
        this.SendObject(response, tmpl);
    }
    
    private void SendTemplatePreview(HttpServletRequest request, HttpServletResponse response) {
        DBMgr dbMgr = null;
        Object obj = null;
        TemplateData td = null;
        
        try{
            obj = GetObject(request);
            if(obj instanceof TemplateData){
                dbMgr = new DBMgr(request, cfg);
                td = dbMgr.getTmplPreview(((TemplateData)obj).GetTmplID());
            } else {
                throw new Exception("Class type don't match");
            }
        } catch (Exception ex){
            if(td == null)
                td = new TemplateData();
            td.setException(ex);
        }
        
        
        dbMgr = null;
        obj = null;
        
        SendObject(response, td);
    }
    
    private void SendTmplIndexList(HttpServletRequest request, HttpServletResponse response) {
        ArrayList tmplIndexes = null;
        DBMgr dbMgr = null;
        Object obj = null;
        
        try {
            obj = GetObject(request);
            if(obj instanceof TemplateData){
                dbMgr = new DBMgr(request, cfg);
                tmplIndexes = dbMgr.GetTmplIndexList((TemplateData) obj);
            } else {
                throw new Exception("Class type don't match");
            }
        } catch (Exception e) {
            e.printStackTrace();
            tmplIndexes.add(e);
        }
        
        dbMgr = null;
        obj = null;
        
        SendObject(response, tmplIndexes);
    }
}

Автор: AntonSaburov 15.3.2007, 18:33
И ты хочешь сказать, что тебе параметры в init() не приходят ? 
Может проверить наименование параметров внимательнее ?

Или что-то другое не получается ?

Автор: ShurikA 15.3.2007, 18:56
Цитата(AntonSaburov @  15.3.2007,  17:33 Найти цитируемый пост)
И ты хочешь сказать, что тебе параметры в init() не приходят ?

Именно так.

Кстати вот web.xml
Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <servlet>
        <servlet-name>ApisServer</servlet-name>
        <servlet-class>apisserver.ApisServer</servlet-class>
        <init-param>
            <param-name>sql_driver</param-name>
            <param-value>com.mysql.jdbc.Driver</param-value>
        </init-param>
        <init-param>
            <param-name>db_url</param-name>
            <param-value>jdbc:mysql://localhost:3306/apisdb</param-value>
        </init-param>
        <init-param>
            <param-name>db_user</param-name>
            <param-value>user</param-value>
        </init-param>
        <init-param>
            <param-name>db_pass</param-name>
            <param-value>pass</param-value>
        </init-param>
        </servlet>
    <servlet-mapping>
        <servlet-name>ApisServer</servlet-name>
        <url-pattern>/ApisServer</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <welcome-file-list>
    <welcome-file>
            index.jsp
        </welcome-file>
    </welcome-file-list>
</web-app>


Автор: Maksym 15.3.2007, 19:05
ShurikA
looks right.. Управление в init() попадает в дебаге? Что за контейнер? Нет ли warn и выше сообщений в логе? Попробуй добавить 
Код
<load-on-startup>1</load-on-startup>
, чтобы инициализация происходила при запуске приложения.

Автор: ShurikA 15.3.2007, 19:34
Цитата(Maksym @  15.3.2007,  18:05 Найти цитируемый пост)
Попробуй добавить 
Разметка XML
<load-on-startup>1</load-on-startup>


Куда?

Автор: Maksym 16.3.2007, 11:59
Код

    <servlet>
        <servlet-name>Servlet Name</servlet-name>
        <servlet-class>mypackage.MyServlet</servlet-class>
        <init-param>
            <param-name>config_param_1_name</param-name>
            <param-value>config_param_1_value</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

Но параметры должны браться и без этого, при первом обращении к сервлету.

Автор: rrrookie 18.3.2007, 13:21
На самом деле проблема в том, что ты переписал инит метод, а оригиналЬный инит метод как раз считывает 
конфиг парапетры при загрузке сервлета... 

если сделаеш так
Код


public void init(ServletConfig sc) throws ServletException {
        //load all needed params
   
        //ServletConfig sc = getServletConfig();
        super.init(sc);
        cfg = new Config(sc.getInitParameter("db_url"), 
                sc.getInitParameter("db_user"), sc.getInitParameter("db_pass"));
    }


всё заработает

Автор: Maksym 19.3.2007, 02:37
rrrookie
стоп, у ShurikA переопределен init() без параметров, который ничего не читает и вызывается уже после загрузки всех параметров:
Код

public abstract class GenericServlet
    implements Servlet, ServletConfig, Serializable {
...
    public void init(ServletConfig config)
        throws ServletException
    {
        this.config = config;
        init();
    }
    public void init()
        throws ServletException {
    }
...
}

Автор: ShurikA 19.3.2007, 02:39
уже всё заработало.  
Код

public void init() throws ServletException {
        //load all needed params
        ServletConfig sc = getServletConfig();
        cfg = new Config(sc.getInitParameter("sql_driver"), sc.getInitParameter("db_url"), 
                sc.getInitParameter("db_user"), sc.getInitParameter("db_pass"));
    }

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