今日学习Spring和Web连用的时候,出现了无法访问Servlet问题,这在以前学习Servlet过程中是没有过的,通过查找各种回答,最后解决了问题,现提供一个完整的测试代码,尽可能把各种原因写全。
一 附上工程路径图片
A 这里需要注意的是web.xml文件必须放在web-inf目录下,这个是和tomcat启动配置有关。
二 JSP页面代码
这里需要注意action=service/registerService这个路径,后面我们会讲,为什么是这个。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="service/registerService" method="post">
用户名:<input type="text" name="name">
密码:<input type="text" name="password">
<input type="submit" value="注册">
</form>
</body>
</html>
三 Servlet代码
A 这一步只要求在service的package下新建一个Servlet文件就行了。
B 为了使用xml文件进行配置Servlet访问,我们必须把开头的注释掉。(以下代码是使用注解方式进行Servelt的访问)
@WebServlet("/registerService")
Servlet具体代码(除了注释掉webservlet,其他没有做任何改变):
package service;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class registerService
*/
//@WebServlet("/registerService")
public class registerService extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public registerService() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
四 web.XML文件的配置
首先要进行一些补充知识:
4.1 如何直接访问Servlet文件:
前提:启动tomcat服务器
在浏览器地址栏中输入 http://localhost:8080/spring_web/service/registerService 便可以直接访问。
着这个url中我们可以得知:
A service/registerService这个就是我们的对应文件路径
B url是以我们项目名spring_web开头的
4.2 xml文件代码:
值得说的点:
A :<servlet-name>可以随便取名字,不一定要和我们的servlet文件名一致,这里为了说明配置与名字无关,我就随便取了
个login的名字。(当然正常开发时,应取一个有意义的名字)
B : 接着A点,<servlet>和<servlet-mapping>两个便签类的servlet-name一定一致的
C :<servlet-class>一定写的是完整的包名+类(Servlet)名
D :url-pattern中的路径一定要加上“/”,否则tomcat服务器无法启动。这个路径就是我们之前url直接访问的项目名后面的路
径名。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>web02</display-name>
<servlet>
<!-- 声明Servlet对象 -->
<servlet-name>login</servlet-name>
<!-- 上面一句指定Servlet对象的名称 -->
<servlet-class>service.registerService</servlet-class>
<!-- 上面一句指定Servlet对象的完整位置,包含包名和类名 -->
</servlet>
<servlet-mapping>
<!-- 映射Servlet -->
<servlet-name>login</servlet-name>
<!--<servlet-name>与上面<Servlet>标签的<servlet-name>元素相对应,不可以随便起名 -->
<url-pattern>/service/registerService</url-pattern>
<!-- 上面一句话用于映射访问URL -->
</servlet-mapping>
</web-app>
五 xml文件的作用
以上就是我们代码部分需要注意的地方。那么xml文件的作用是什么呢?他的执行顺序是什么呢?
1、tomcat启动,会查找到web-inf下的XML文件进行配置,初始化
2 、当我们点击表单的提交后,浏览器会跳转到action中写的“service/registerService”这个地址下,注意这个并不是直接填
写到url中的,它会去xml文件中找url-pattern为service/registerService的映射。
最后我们会在浏览器中看到点击提交后跳转的地址是: http://localhost:8080/spring_web/service/registerService
小结:了解原理后,可以预想到要是把jsp文件的action=“”换成任意名字也可以,只要保证他的名字和xml文件中url-pattern
名字相同就可以,相应的可以看一下跳转后的浏览器地址,它是和action的名字保持一致的。大家可以试一试
3 、在xml中,找到同名的映射后,根据servlet-name会找到servlet-class,对应的Servlet文件路径位置。
六 总结:
JSP文件的action路径名需要和XML文件中的url-pattern路径名相同。