在初学servlet的时候路径的确是个问题,如果不好好的搞懂,在实际应用中真的会犯糊涂。
下面通过几个例子分析和看下到底是个什么状况。
有如下一个表单:test.jsp( 此文件在 WebRoot 的 根目录 下)
<form action="SecondServlet"> UserName:<input type="text" name="username" size="20"/> Password:<input type="password" name="password" size="20"/> <input type="submit" value="OK"/> </form>
另一种action 的配置方式:
<form action="/JSP/SecondServlet">
web.xml配置如下:
<servlet> <servlet-name>SecondServlet</servlet-name> <servlet-class>com.test.servlet.SecondServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SecondServlet</servlet-name> <url-pattern>/SecondServlet</url-pattern> </servlet-mapping>
SecondServlet.java:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.process(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.process(request, response);
}
public void process(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String username=request.getParameter("username");
String password=request.getParameter("password");
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.println("<h1>"+username+"<br>"+password+"</h1>");
}
疑问?
刚刚在配置文件中<servlet-name>和<url-pattern>写的都一样,那么 jsp页面中的表单form的action是根据什么来找到对应的servlet的呢?
是根据<servlet-name> 还是根据<url-pattern>
下面通过修改web.xml 和test.jsp 表单中的action 来观察。
<form action="MyServlet">(写的是url-pattern的名字)
<servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>com.test.servlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> </servlet-mapping>
此时输入localhost/JSP/test.jsp ,提交发现页面的跳转:
http://localhost/JSP/MyServlet?username=admin&password=admin
在此就证明了jsp 页面和 servlet 相关联是通过 <url-pattern> 联系起来的!
要是不放心,可以再次修改:
<form action="Firstervlet">(写的是servlet-name的名字)
此时在运行,发现程序会报404 错误 .
下面又有问题了:
此时如果test.jsp 在 jsp 文件下,即 (WebRoot-->jsp-->test.jsp )
<servlet> <servlet-name>SecondServlet</servlet-name> <servlet-class>com.test.servlet.SecondServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SecondServlet</servlet-name> <url-pattern>/SecondServlet</url-pattern> </servlet-mapping>
根据上面的配置可以很容易的想到:
<form action="/JSP
/SecondServlet">
或者
<form action="SecondServlet">
再改进:
<servlet>
<servlet-name>SecondServlet</servlet-name>
<servlet-class>com.test.servlet.SecondServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SecondServlet</servlet-name>
<url-pattern>/second/SecondServlet
</url-pattern>
</servlet-mapping>
那么
<form action="second/SecondServlet">
还有一种配置方法:
如:demo.html 在 JSP-->WebRoot-->serdemo 下
修改web.xml
<servlet-mapping>
<servlet-name>input</servlet-name>
<url-pattern>/serdemo/input
</url-pattern>(相应的文件夹)
</servlet-mapping>
此时的配置方式是直接写出了文件夹的名称。
那么demo.html 中怎么写呢?
<form action="input
" method="post">
总结:
在jsp 页面中配置 servlet 路径的时候根据 url-pattern 配置
有两种形式:
通用 (在根目录下或者在某个文件下 )
<url-pattern>/x/y</url-pattern>
那么jsp/html 中就这样 ( 以表单为例 ) :
action="x/y"
或者
action="/项目名称/x/y" (注意项目名称前面要加/
)
在文件下:
<url-pattern>/文件夹名称
/y</url-pattern>
那么jsp/html 中就这样:
action="y"