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

目录
相关文章
|
2月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
58 4
|
5天前
|
XML JSON Java
Spring Boot 开发中常见的错误
本文总结了 Java 开发中常见的几个问题及其改进方法,包括:1. 过度使用 `@Component` 注解;2. `@ResponseBody` 注解的错误用法;3. `@Autowired` 的不当使用;4. `application.properties` 管理不善;5. 异常处理不当。每部分详细解释了错误情况和建议的改进方案,并提供了相应的代码示例。
35 11
|
6天前
|
IDE Java 测试技术
互联网应用主流框架整合之Spring Boot开发
通过本文的介绍,我们详细探讨了Spring Boot开发的核心概念和实践方法,包括项目结构、数据访问层、服务层、控制层、配置管理、单元测试以及部署与运行。Spring Boot通过简化配置和强大的生态系统,使得互联网应用的开发更加高效和可靠。希望本文能够帮助开发者快速掌握Spring Boot,并在实际项目中灵活应用。
24 5
|
6天前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
22 4
|
3天前
|
前端开发 Java 开发者
这款免费 IDEA 插件让你开发 Spring 程序更简单
Feign-Helper 是一款支持 Spring 框架的 IDEA 免费插件,提供 URL 快速搜索、Spring Web Controller 路径一键复制及 Feign 与 Controller 接口互相导航等功能,极大提升了开发效率。
|
23天前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
69 2
|
23天前
|
前端开发 JavaScript Java
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
如何使用 Spring Boot 和 Angular 开发全栈应用程序:全面指南
33 1
|
10天前
|
XML Java 数据格式
Spring Boot 开发中的常见失误
本文深入分析了Spring Boot开发中常见的失误,包括不当使用@Component、@ResponseBody、@Autowired注解,以及不良的异常处理和日志记录实践,提供了有效的规避策略,帮助开发者提升代码质量和系统性能。
|
1月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
42 2
|
2月前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。