利用Spring MVC开发程序2

简介: 利用Spring MVC开发程序

利用Spring MVC开发程序1:https://developer.aliyun.com/article/1521792

获取Cookie信息

在之前使用Servlet来获取Cookie信息时,首先就需要利用HttpServletRequest对象来获取所有的cookie信息,然后进行遍历。

@RequestMapping("/cookie")
    public String getCookie(HttpServletRequest req){
        Cookie[] cookies = req.getCookies();
        StringBuilder stringBuilder = new StringBuilder();
        for(Cookie item : cookies){
            stringBuilder.append("CookieName:"+item.getName()+
                    "cookieValue:"+item.getValue()+" \n");
        }
        return stringBuilder.toString();
    }

使用@CookieValue注解来实现Cookie信息的读取,但是使用该注解只能获取一个参数信息,若要获得多个参数的注解就需要在之后继续使用该注解来进行获取。

我们可以在前端页面的控制台先添加几个cookie信息,方便进行测试。

获取name信息:

还想要获取age信息的话,就再使用@CookieValue注解:

@RequestMapping("/getcookie")
    public String getcookie(@CookieValue("name") String namevalue,@CookieValue("age") String age){
        return "nameValue:"+namevalue+",ageValue:"+age;
    }

获取请求头Header信息

使用Servlet在进行获取时,同样要从HttpServletRequest对象中来进行获取,但是在Spring MVC项目中就可以使用@RequestHeader注解来进行获取:

@RequestMapping("header")
    public String getHeader(@RequestHeader("User-Agent") String value){
        return "User-Agent:"+value;
    }

存储和获取Session信息  

在获取Session信息之前先要存储Session信息,可以使用代码现将Session信息进行存储:

@RequestMapping("/setsession")
    public boolean setSession(HttpServletRequest req){
        boolean flag = false;
        HttpSession session = req.getSession(true);//没有Session对象就先进行创建
        session.setAttribute("userinfo","user");
        flag = true;
        return flag;
    }

Session信息存储完成之后就要进行信息的获取,需要使用@SessionAttribute注解,设置value属性为要获取的Session对象,required属性设置为false,表示要获取的Session对象即使为空程序也不会进行报错。

@RequestMapping("/getsession")
    public String getSession(@SessionAttribute(value = "userinfo",required = false) String info){
        return "userinfo:"+info;
    }

三、返回数据

返回静态页面

在没加任何注解的情况默认返回的是静态页面,当返回的不是静态页面就会报错:

@RequestMapping("/test")
    public String get(){
        return "test";
    }

当修改返回的是一个html静态页面时,程序就能正确运行:

@RequestMapping("/test")
    public String get(){
        return "test.html";
    }

返回非静态页面的数据

当我们要返回的是非静态页面的数据时就需要用到@ResponseBody注解,该注解既能修饰类,也能修饰方法。

@Controller
@ResponseBody
public class ReceiveController {
    @RequestMapping("/test")
    public String get(){
        return "test.html";
    }
}

也能直接在类之前使用 @RestController注解来代替@Controller注解和@ResponseBody注解,来返回非静态页面的数据。

请求转发

请求转发:客户端向服务器端发送请求,服务器收到请求之后会现将请求转发给目标地址,然后将目标地址的结果返回给客户端。

请求转发有两种实现方式:

方式一:在forward之后加请求转发的内容地址:

@RequestMapping("/fw")
    public String fw(){
        return "forward:/test.html";
    }

此处若要跳转到test.html页面,切忌加@ ResponseBody注解。

方式二:使用http请求的getRequestDispatcher方法获取到要转发的对象,然后利用forwad进行转发:

 @RequestMapping("fw2")
    public void fw2(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/test.html").forward(req,resp);
    }

请求重定向

请求重定向:客户端向服务端发送一个请求,然后服务器端会给客户端发送一个临时响应头,这个响应头中包含客户端需再次访问的url地址,客户端收到地址之后就需要将请求再次转发给新的目标地址。

方式一: 在redirect之后加上请求重定向的地址:

@RequestMapping("/rd")
    public String rd(){
        return "redirect:/test.html";
    }

虽然 输入的是rd路由地址,但是会重定向到test.html。

方式二:使用HttpServletResponse对象的sendRedirect进行重定向:

@RequestMapping("/rd2")
    public void rd2(HttpServletResponse resp) throws IOException {
        resp.sendRedirect("/test.html");
    }

请求转发 VS 请求重定向


定义不同:请求转发是客户端给服务器端发送请求,服务器端收到请求后会将请求转发给目标地址,然后将目标地址的结果返回给客户端;请求重定向是客户端给服务器端发送请求,服务器端收到请求之后会给客户端返回一个临时响应头,里面包含了客户端需再次访问的url地址,客户端就需要将请求再次发送新的目标url地址。

请求方不同:请求转发是服务器端的行为,服务器代替客户端发送请求给目标地址;请求重定向是客户端行为,客户端需将请求转发给新的目标地址。

数据共享不同:请求转发的客户端只发送一次请求整个交互过程就只有一个HttpRequest对象和一个HttpResponse对象,整个过程请求和返回的数据可以共享;但是请求重定向发送了两次请求,HttpResponse对象和HttpRequest对象不唯一,整个过程数据不可共享。

最终的url地址不同:请求转发的url地址就是请求的url地址,但是请求重定向的最终的url地址是第一次请求之后服务端返回的临时响应头中的目标url地址。

代码实现不同:上文已进行说明。

四、案例演示

1、利用form表单实现两数相加

前端页面使用form表单实现:

    <form action="cal">
        num1:<input type="text" name="num1"><br>
        num2:<input type="text" name="num2"><br>
        <input type="submit" value="add">
    </form>

后端将前端获取的两数进行相加,并将结果打印,并添加了一个可以返回的超链接:

@RequestMapping("/cal")
    @ResponseBody
    public String cal(Integer num1,Integer num2){
        return "<h1>" + (num1+num2) +"</h1>"+"</br>" +
                "<a href='javascript:history.go(-1);'>返回</a>";
    }

效果展示:

点击add按钮之后:

2、利用ajax实现页面登录

前端使用ajax:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>login</title>
    <script src="js/jquery.min.js"></script>
    <script>
        function login(){
            var username = jQuery("#username");
            var password = jQuery("#password");
            if(jQuery.trim(username.val())===""){
                alert("请输入用户名");
                username.focus();//光标重置
                return;
            }
            if(jQuery.trim(password.val())===""){
                alert("请输入密码");
                password.focus();
                return;
            }
            jQuery.ajax({
                url:"/login",
                type:"POST",
                contentType:"application/json",
                data:JSON.stringify({"username":username.val(),"password":password.val()}),
                success:function (result){
                    alert(JSON.stringify(result));
                }
            });
        }
    </script>
</head>
<body>
    <div style="text-align: center">
    <h1>登录</h1>
    用户名:<input type="text" id="username"><br>
    密 码:<input type="password" id="password"><br>
    <input type="submit" value="登录" onclick="login()" style="margin-top: 20px;margin-left: 50px;">
    </div>
</body>
</html>

后端使用返回Json格式的数据给前端:

@Controller
public class Login {
    @ResponseBody
    @RequestMapping("/login")
    public HashMap<String,Object> login(@RequestBody Userinfo userinfo){
        HashMap<String,Object> result = new HashMap<>();
        int state = 200;
        if(userinfo.getUsername()!= null && userinfo.getPassword() != null
        && userinfo.getUsername().equals("user") && userinfo.getPassword().equals("user")){
            result.put("msg","登录成功");
        }else{
            result.put("msg","登录失败");
        }
        result.put("state",state);
        return result;
    }
}

目录
相关文章
|
8天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
82 29
|
12天前
|
监控 Java 应用服务中间件
SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析
Spring Boot 通过简化配置、自动配置和嵌入式服务器等特性,大大简化了 Spring 应用的开发过程。它通过提供一系列 `starter` 依赖和开箱即用的默认配置,使开发者能够更专注于业务逻辑而非繁琐的配置。Spring Boot 的自动配置机制和强大的 Actuator 功能进一步提升了开发效率和应用的可维护性。通过对其源码的分析,可以更深入地理解其内部工作机制,从而更好地利用其特性进行开发。
32 6
|
22天前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
2月前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
490 0
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
|
2月前
|
XML JSON Java
Spring Boot 开发中常见的错误
本文总结了 Java 开发中常见的几个问题及其改进方法,包括:1. 过度使用 `@Component` 注解;2. `@ResponseBody` 注解的错误用法;3. `@Autowired` 的不当使用;4. `application.properties` 管理不善;5. 异常处理不当。每部分详细解释了错误情况和建议的改进方案,并提供了相应的代码示例。
66 11
|
2月前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
64 5
|
2月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
63 4
|
2月前
|
前端开发 Java 开发者
这款免费 IDEA 插件让你开发 Spring 程序更简单
Feign-Helper 是一款支持 Spring 框架的 IDEA 免费插件,提供 URL 快速搜索、Spring Web Controller 路径一键复制及 Feign 与 Controller 接口互相导航等功能,极大提升了开发效率。