m0_74217538 2024-07-21 16:09 采纳率: 0%
浏览 9

IDEA中,在Servlet里面运用@RequestMapping无法获取到前端jsp页面中的参数

IDEA中,在Servlet里面运用@RequestMapping无法获取到前端jsp页面中的参数
前端login.jsp页面代码

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>登录页面</title>
    <link rel="stylesheet" href="css/login.css">
</head>
<body>
<div id="header">
    <div class="cover">
        <span class="text0">欢迎访问大学生家教服务系统</span>
    </div>
</div>
<div id="nav">
    <div class="leftbox">

    </div>
    <div id="login">
    <div class="form">
        <a href="open.jsp">返回初始页面</a>
        <form id="loginForm" action="LoginController" method="post">&emsp;&emsp;户:<input id="username" type="text" name="username"><br>&emsp;&emsp;码:<input id="password" type="password" name="password"><br>&emsp;&emsp;份:<select id="identity" name="identity">
                <option value="学生">学生</option>
                <option value="教师">教师</option>
                <option value="中介">中介</option>
                <option value="管理员">管理员</option>
            </select><br>&ensp;&ensp;码:<input type="text" id="captcha" name="captcha"><br>
            <img :src="captchaUrl" @click="clickImg" width="135px" height="33px"  />
            <button type="submit" onclick="validateForm()">登录</button>
        </form>
    </div>
    </div>
    <div class="rightbox">

    </div>
</div>
<div id="banner">

</div>
<div id="footer">
</div>

<!--<audio controls autoplay>-->
<!--    <source src="http://music.163.com/song/media/outer/url?id=2095353936.mp3"  autoplay >-->
<!--    Your browser does not support the audio element.-->
<!--</audio>-->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script type="text/javascript">
    new Vue({
        el:'#login',
        name:"login",
        data(){
           return{
               admin:{},
              captchaUrl:'/captcha'
           }
        },
        methods: {
            clickImg() {
                this.captchaUrl = '/captcha?' + Math.random();; // 更新 URL 以防止缓存
            }
        },
        mounted() {
            this.clickImg(); // 组件挂载时初始化验证码图片
        }
    });
</script>
<script>
function validateForm() {
var password = document.getElementById('password').value;
if (!password.match(/^(?=.*\d)(?=.*[a-zA-Z])(.{4,})$/)) {
alert('密码因包含数字和字母且至少有4位');
return false;
        }
    }
</script>
</body>
</html>


后端LoginController.java代码

package Login;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Objects;
import com.wf.captcha.SpecCaptcha;
import com.wf.captcha.utils.CaptchaUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@RestController
@CrossOrigin
@WebServlet("/LoginController")
public class LoginController extends HttpServlet {
    private LoginService loginService;
    private String very;
    @Override
    public void init() throws ServletException {
        System.out.println("0000");
        loginService = new LoginService(new LoginDAO());
    }
    @RequestMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("11111111111111111111111");
        response.setHeader("Cache-Control", "no-store, no-cache");
        response.setContentType("image/jpeg");
        SpecCaptcha captcha=new SpecCaptcha(135,33,4);
        captcha.setCharType(com.wf.captcha.base.Captcha.TYPE_ONLY_NUMBER);
        CaptchaUtil.out(captcha,request,response);
        System.out.println("222222222222222222222222");
    }
    @PostMapping("/LoginController")
    public String login(@RequestBody Login user, HttpServletRequest request){
        System.out.println("33333333333333333333333333333333");
        if(!CaptchaUtil.ver(user.getCaptcha(), request)){
            CaptchaUtil.clear(request);
        }
        System.out.println(user.getCaptcha()+request);
        System.out.println("4444444444444444444444444444444");
        return "验证码错误";
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String captcha = request.getParameter("captcha");
        String identity = request.getParameter("identity");
        HttpSession session = request.getSession();

        Login login = new Login(username, password, identity, captcha,very);
        if(loginService.Login(login).getReason()==null){
            LoginResult result=loginService.Login(login);
            int uId = result.getId();
            session.setAttribute("uId", uId);
            session.setAttribute("identity",identity);
            session.setAttribute("verycode",very);
            System.out.println(uId);
            System.out.println(identity);
            System.out.println(very);
            if(Objects.equals(identity, "教师")){
                request.getRequestDispatcher("/teacher.jsp").forward(request, response);
            }
            else {
                request.getRequestDispatcher("/loginSuc.jsp").forward(request, response);
            }
        }
        else{
            LoginResult result = loginService.Login(login);
            request.setAttribute("reason", result);
            request.getRequestDispatcher("/loginFailure.jsp").forward(request, response);
        }
    }
}

在这个代码里面,我前端的验证码:

 <img :src="captchaUrl" @click="clickImg" width="135px" height="33px"  />
<script type="text/javascript">
    new Vue({
        el:'#login',
        name:"login",
        data(){
           return{
               admin:{},
              captchaUrl:'/captcha'
           }
        },
        methods: {
            clickImg() {
                this.captchaUrl = '/captcha?' + Math.random();; // 更新 URL 以防止缓存
            }
        },
        mounted() {
            this.clickImg(); // 组件挂载时初始化验证码图片
        }
    });
</script>

后端的代码


```java
 @RequestMapping("/captcha")
    public void captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("11111111111111111111111");
        response.setHeader("Cache-Control", "no-store, no-cache");
        response.setContentType("image/jpeg");
        SpecCaptcha captcha=new SpecCaptcha(135,33,4);
        captcha.setCharType(com.wf.captcha.base.Captcha.TYPE_ONLY_NUMBER);
        CaptchaUtil.out(captcha,request,response);
        System.out.println("222222222222222222222222");
    }
    @PostMapping("/LoginController")
    public String login(@RequestBody Login user, HttpServletRequest request){
        System.out.println("33333333333333333333333333333333");
        if(!CaptchaUtil.ver(user.getCaptcha(), request)){
            CaptchaUtil.clear(request);
        }
        System.out.println(user.getCaptcha()+request);
        System.out.println("4444444444444444444444444444444");
        return "验证码错误";
    }

后端的RequestMapping获取不到前端的参数,函数中的几个输出一个都没有实现.
  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2024-07-21 16:09
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    从你提供的代码和描述来看,这个问题有几个可能的原因,我们可以逐一排查:

    1. 前端表单提交

      • 检查 login.jsp 中的表单 action 属性是否指向了正确的 URL。它应该指向你的 LoginController 的映射路径。
      • 确保表单的 method 属性设置为 post,因为登录信息通常是通过 POST 请求提交的。
    2. 后端映射配置

      • 你的 LoginController 类同时使用了 @RestController@WebServlet 注解,这可能会导致冲突。@RestController 通常用于 Spring MVC 控制器,而 @WebServlet 是 Servlet API 的注解。你需要决定使用哪一个。如果你使用的是 Spring MVC,应该使用 @RestController 并移除 @WebServlet
    3. 参数接收

      • @PostMapping("/LoginController") 中,你使用了 @RequestBody Login user 来接收参数,这意味着 Spring 期望接收到的是 JSON 格式的请求体。但是,从你的 JSP 表单来看,它发送的是表单数据(application/x-www-form-urlencoded),这与 @RequestBody 的预期不匹配。你应该使用 @RequestParam 来接收表单数据,或者确保前端发送的是 JSON 格式的数据。
    4. Spring MVC 配置

      • 如果你决定使用 Spring MVC,确保你的项目中包含了 Spring MVC 的依赖,并且在配置文件中(例如 web.xml 或 Spring Boot 的 application.properties/application.yml)正确配置了 DispatcherServlet。
    5. 验证码处理

      • 确保前端的 Vue.js 实例能够正确地更新验证码图片的 URL,并且后端能够处理这些请求并返回新的验证码。
    6. 日志和调试

      • 增加日志输出,特别是在 login 方法中,以确认请求是否到达了预期的处理方法。
    7. Spring MVC 和 Servlet API 整合

      • 如果你打算同时使用 Spring MVC 和 Servlet API,需要确保它们不会互相冲突,并且 Spring MVC 能够正确处理请求。
    8. 前端 JavaScript 验证

      • 确保 validateForm 函数在表单提交时被调用,并且验证逻辑正确。

    根据你的描述和代码,我建议首先解决 @RestController@WebServlet 的冲突问题,然后调整参数接收的方式,确保前端发送的数据格式与后端接收的方式一致。如果前端发送的是表单数据,后端应该使用 @RequestParam 来接收。如果前端发送的是 JSON 数据,确保 @RequestBody 与前端发送的数据格式匹配。同时,确保 Spring MVC 配置正确,以便能够处理来自前端的请求。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月21日