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