Java Servlet中的参数传递不正确

Java Servlet中的参数传递不正确,java,servlets,parameter-passing,Java,Servlets,Parameter Passing,我试图编写一个简单的Javaservlet来列出目录中的文件。路径存储在web.xml的init param中。调用getInitParameters()时,它返回目录路径。但当我试图将其传递给处理程序时,它返回null。不知道我做错了什么。有什么帮助吗 import java.io.File; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; impo

我试图编写一个简单的Javaservlet来列出目录中的文件。路径存储在web.xml的init param中。调用getInitParameters()时,它返回目录路径。但当我试图将其传递给处理程序时,它返回null。不知道我做错了什么。有什么帮助吗

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

interface Handler {
  public void doGet (HttpServletRequest request, HttpServletResponse response) 
    throws IOException; 
}

class DispatchChoice {
  public final String param; 
  public final GetHandler getHandler; 
  public DispatchChoice (String param, Handler getHandler) 
  {
    this.param = param;
    this.getHandler = getHandler;
  }
}

public class MyServlet extends HttpServlet
{
    String value;
    public void init() throws ServletException {
        value = getInitParameter("addressfile"); // correct value is saved here
        System.out.println("Init value : "+value);
    }
  DispatchChoice myChoice = new DispatchChoice("/test1", new FileHandler(value));

  public void doGet (HttpServletRequest request, HttpServletResponse response) 
    throws IOException
  {
        myChoice.getHandler.doGet(request, response);
  }
}

class FileHandler implements Handler {
    private String place;
    public FileHandler (String value){
        this.place = value; // this is NULL, not the value from above
        System.out.println("Param value : " + value);
    }

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException {
        File directory = new File(place); //is NULL
        File[] files = directory.listFiles();
        PrintWriter pw = response.getWriter();
        for (int index = 0; index < files.length; index++) {
            pw.println(files[index].getName());
        }
    }
}
导入java.io.File;
导入java.io.IOException;
导入java.io.PrintWriter;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
接口处理程序{
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出IOException;
}
类分派选择{
公共最终字符串参数;
公共最终GetHandler GetHandler;
公共DispatchChoice(字符串参数,处理程序getHandler)
{
this.param=param;
this.getHandler=getHandler;
}
}
公共类MyServlet扩展了HttpServlet
{
字符串值;
public void init()引发ServletException{
value=getInitParameter(“addressfile”);//此处保存了正确的值
System.out.println(“初始值:”+值);
}
DispatchChoice myChoice=新DispatchChoice(“/test1”,新文件处理程序(值));
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出IOException
{
myChoice.getHandler.doGet(请求、响应);
}
}
类FileHandler实现处理程序{
私人弦乐场;
公共文件处理程序(字符串值){
this.place=value;//这是NULL,不是上面的值
System.out.println(“参数值:”+值);
}
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出IOException{
文件目录=新文件(位置);//为空
File[]files=目录.listFiles();
PrintWriter pw=response.getWriter();
对于(int index=0;index
web.xml

<servlet>
<servlet-name>ListManagerServlet</servlet-name>
<servlet-class>savva.listmanagerservlet.ListManagerServlet</servlet-class>
<init-param>
    <param-name>addressfile</param-name>
    <param-value>d:\\temp\\</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ListManagerServlet</servlet-name>
<url-pattern>/ListManagerServlet</url-pattern>
</servlet-mapping>

ListManagerServlet
savva.listmanagerservlet.listmanagerservlet
地址文件
d:\\temp\\
ListManagerServlet
/ListManagerServlet
这一行是在
init()
之前执行的,因此
value
仍然是
null
且尚未赋值!相反,将赋值移到
init()
中,类似于:

DispatchChoice myChoice;

public void init() throws ServletException
{
    value = getInitParameter("addressfile"); // correct value is saved here
    myChoice = new DispatchChoice("/test1", new FileHandler(value));
    System.out.println("Init value : "+value);
}
这一行是在
init()
之前执行的,因此
value
仍然是
null
且尚未赋值!相反,将赋值移到
init()
中,类似于:

DispatchChoice myChoice;

public void init() throws ServletException
{
    value = getInitParameter("addressfile"); // correct value is saved here
    myChoice = new DispatchChoice("/test1", new FileHandler(value));
    System.out.println("Init value : "+value);
}
创建实例时,在调用init()之前,您正在初始化myChoice,因此
value
仍然为null

init()中初始化它

创建实例时,在调用init()之前,您正在初始化myChoice,因此
value
仍然为null


init()中初始化它

在servlet中初始化类menber

 DispatchChoice myChoice = new DispatchChoice("/test1", new FileHandler(value));
在init()方法之前,使用init参数的hte path初始化值,使其为null

你应该把它实现为

public void init() throws ServletException {
    value = getInitParameter("addressfile"); // correct value is saved here
    if (myChoice == null) {
        myChoice  = new DispatchChoice("/test1", new FileHandler(value))}
    }
    System.out.println("Init value : "+value);
}
DispatchChoice myChoice = null;

在servlet中初始化类menber

 DispatchChoice myChoice = new DispatchChoice("/test1", new FileHandler(value));
在init()方法之前,使用init参数的hte path初始化值,使其为null

你应该把它实现为

public void init() throws ServletException {
    value = getInitParameter("addressfile"); // correct value is saved here
    if (myChoice == null) {
        myChoice  = new DispatchChoice("/test1", new FileHandler(value))}
    }
    System.out.println("Init value : "+value);
}
DispatchChoice myChoice = null;

经过一些搜索,我发现使用getServletContext().get/set Attribute()比以前的设计更好。但是谢谢你解释我的问题。

经过一些搜索,我发现使用getServletContext().get/set Attribute()比以前的设计更好。但是,感谢您解释我的问题。

我想做的是让多个处理程序根据用户的不同执行不同的操作。因此,我将创建一个处理程序列表,并根据“param”字段检查用户想要哪个处理程序。如果我有几个传入值的处理程序,我应该在init()中初始化它们吗?或者有更好的方法吗?本质上,我希望我的一些处理程序能够获取GetInitParameter的值。我正在尝试的是让多个处理程序根据用户的不同执行不同的操作。因此,我将创建一个处理程序列表,并根据“param”字段检查用户想要哪个处理程序。如果我有几个传入值的处理程序,我应该在init()中初始化它们吗?或者有更好的方法吗?本质上,我希望我的一些处理程序能够获取getInitParameter的值