Servlet使用注解配置URl提示404错误

Servlet注解配置URL
本文介绍如何使用Servlet 3.0的注解配置URL映射,并解决404错误问题。详细解释了如何通过注解简化配置过程及与web.xml交互的方式。

Servlet使用注解配置URl提示404错误

之前配置Servlet作为URL的时候,都是在web.xml中配置的,配置方法大概如下:

如果我有这样一个Servlet的话:



hello.Java代码:

  1. package test;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. public class hello extends HttpServlet {  
  12.   
  13.     @Override  
  14.     protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {  
  15.         // TODO Auto-generated method stub  
  16.         PrintWriter out = arg1.getWriter();  
  17.         out.print("Hello World!");  
  18.         out.close();  
  19.     }  
  20.       
  21. }  



可以在web.xml中这样配置:

  1. <servlet>  
  2.         <servlet-name>hello</servlet-name><!-- 这里的name与下面的name一致即可 -->  
  3.         <servlet-class>test.hello</servlet-class><!-- 使用到的class文件 -->  
  4.     </servlet>  
  5.     <servlet-mapping>  
  6.         <servlet-name>hello</servlet-name><!-- 与上面的name一致 -->  
  7.         <url-pattern>/hello</url-pattern><!-- 所映射的URL -->  
  8.     </servlet-mapping>  


运行这个Servlet:



但是如果这样的Servlet多的话,每个都需要配置会很麻烦。


然后今天学到了注解,Servlet3.0之后可以在Servlet中使用注解直接配置URL。

需要在Servlet中导入 import javax.servlet.annotation.WebServlet;

然后使用@WebServlet("/URlname")

就可以直接配置了,然后通过所输入的URL可以直接访问到。


使用注解配置刚才的Servlet代码如下:



这里需要将刚才在web.xml中配置的内容删除掉(后面会演示如果不删除的话会出现什么情况)。


但是这样直接运行的话,却提示404资源不存在。



解决的办法就是将web.xml中的metadate-complete=“true”,修改为false。


修改false之后再次运行即可成功运行。




如果使用了注解之后,还要继续在web.xml中配置该Servlet的话,会出现如下情况:


web.xml中为该Servlet配置成helloweb。



Servlet中使用注解配置成hellozhujie。



但是运行之后显示的是helloweb:



很显然,当web.xml和注解同时存在的时候,使用的是web.xml中所配置的内容,而忽略了注解配置的内容。


为什么将metadate-complete设置为false,就可以运行了呢?

因为:

Servlet 3.0 的部署描述文件 web.xml 的顶层标签 <web-app> 有一个 metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。如果设置为 true,则容器在部署时将只依赖部署描述文件,忽略所有的注解(同时也会跳过 web-fragment.xml 的扫描,亦即禁用可插性支持,具体请看后文关于 可插性支持的讲解);如果不配置该属性,或者将其设置为 false,则表示启用注解支持(和可插性支持)。

复制于:Servlet3.0新特性详解


下面是一个 **不使用注解** 的 Java Servlet 项目,实现一个简单的登录功能。该示例使用 `web.xml` 配置 Servlet 映射,并通过表单提交用户名和密码进行处理。 --- ### ✅ 功能说明 - 用户访问 `login.html` 页面 - 输入用户名和密码后提交到 `LoginServlet` - Servlet 判断是否为 `admin/123456` - 成功:跳转到欢迎页面 - 失败:返回错误信息 --- ### 📁 项目结构 ``` simple-login/ ├── src/ │ └── main/ │ ├── java/ │ │ └── com/example/servlet/LoginServlet.java │ └── webapp/ │ ├── login.html │ ├── success.html │ └── WEB-INF/ │ └── web.xml └── pom.xml ``` --- ### 1. `pom.xml`(Maven 配置) ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>simple-login</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <!-- Servlet API --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build> </project> ``` --- ### 2. `login.html`(登录页面) ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <h2>用户登录</h2> <form action="login" method="post"> 用户名:<input type="text" name="username" required><br><br> 密码:<input type="password" name="password" required><br><br> <input type="submit" value="登录"> </form> </body> </html> ``` --- ### 3. `success.html`(登录成功页) ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>登录成功</title> </head> <body> <h2>🎉 登录成功!</h2> <p>欢迎回来!</p> <a href="login.html">返回登录</a> </body> </html> ``` --- ### 4. `LoginServlet.java`(处理登录逻辑) ```java package com.example.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class LoginServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 设置请求和响应编码 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); // 获取表单数据 String username = request.getParameter("username"); String password = request.getParameter("password"); PrintWriter out = response.getWriter(); // 简单验证(实际应使用数据库 + 加密) if ("admin".equals(username) && "123456".equals(password)) { // 登录成功,跳转到成功页面 response.sendRedirect("success.html"); } else { // 登录失败,返回错误提示 out.println("<html><body>"); out.println("<h2 style='color:red;'>❌ 登录失败:用户名或密码错误!</h2>"); out.println("<a href='login.html'>重新登录</a>"); out.println("</body></html>"); } } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 如果是 GET 请求,也转发到登录页 response.sendRedirect("login.html"); } } ``` --- ### 5. `WEB-INF/web.xml`(配置 Servlet 映射) ```xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- 定义 Servlet --> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.example.servlet.LoginServlet</servlet-class> </servlet> <!-- 映射 URL --> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping> <!-- 设置欢迎页面 --> <welcome-file-list> <welcome-file>login.html</welcome-file> </welcome-file-list> </web-app> ``` --- ### 🔧 部署与运行步骤 1. 使用 Maven 打包: ```bash mvn clean package ``` 2. 将生成的 `simple-login.war` 放入 Tomcat 的 `webapps/` 目录。 3. 启动 Tomcat。 4. 访问:[http://localhost:8080/simple-login](http://localhost:8080/simple-login) --- ### 🖼️ 运行效果 - 默认打开 `login.html` - 输入 `admin` / `123456` → 跳转到 `success.html` - 其他输入 → 显示错误信息 --- ### ⚠️ 注意事项 - 此为最简实现,**无安全防护**(如 SQL 注入、XSS、密码明文等)。 - 实际项目中应使用: - 数据库验证用户 - 密码加密(如 BCrypt) - Session 管理用户状态 - 过滤器防止未登录访问 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值