利用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;
    }
}

目录
相关文章
|
1天前
|
XML Java 测试技术
spring复习01,IOC的思想和第一个spring程序helloWorld
Spring框架中IOC(控制反转)的思想和实现,通过一个简单的例子展示了如何通过IOC容器管理对象依赖,从而提高代码的灵活性和可维护性。
spring复习01,IOC的思想和第一个spring程序helloWorld
|
14天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
4天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
365 5
|
1天前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
15天前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
15天前
|
Java 数据库连接 Maven
Spring基础1——Spring(配置开发版),IOC和DI
spring介绍、入门案例、控制反转IOC、IOC容器、Bean、依赖注入DI
Spring基础1——Spring(配置开发版),IOC和DI
|
22天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
54 2
|
24天前
|
NoSQL 前端开发 Java
使用 Spring Boot + Neo4j 实现知识图谱功能开发
在数据驱动的时代,知识图谱作为一种强大的信息组织方式,正逐渐在各个领域展现出其独特的价值。本文将围绕使用Spring Boot结合Neo4j图数据库来实现知识图谱功能开发的技术细节进行分享,帮助读者理解并掌握这一技术栈在实际项目中的应用。
93 4
|
26天前
|
安全 Java 开发者
强大!Spring Cloud Gateway新特性及高级开发技巧
在微服务架构日益盛行的今天,网关作为微服务架构中的关键组件,承担着路由、安全、监控、限流等多重职责。Spring Cloud Gateway作为新一代的微服务网关,凭借其基于Spring Framework 5、Project Reactor和Spring Boot 2.0的强大技术栈,正逐步成为业界的主流选择。本文将深入探讨Spring Cloud Gateway的新特性及高级开发技巧,助力开发者更好地掌握这一强大的网关工具。
97 6
|
26天前
|
IDE Java 开发工具
还在为繁琐的配置头疼吗?一文教你如何用 Spring Boot 快速启动,让开发效率飙升,从此告别加班——打造你的首个轻量级应用!
【9月更文挑战第2天】Spring Boot 是一款基于 Spring 框架的简化开发工具包,采用“约定优于配置”的原则,帮助开发者快速创建独立的生产级应用程序。本文将指导您完成首个 Spring Boot 项目的搭建过程,包括环境配置、项目初始化、添加依赖、编写控制器及运行应用。首先需确保 JDK 版本不低于 8,并安装支持 Spring Boot 的现代 IDE,如 IntelliJ IDEA 或 Eclipse。
81 5