利用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月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
4天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
15 2
|
25天前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
9天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
21 0
|
1月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
1月前
|
Java 数据库连接 Spring
【2021Spring编程实战笔记】Spring开发分享~(下)
【2021Spring编程实战笔记】Spring开发分享~(下)
26 1
|
1月前
|
开发框架 Java API
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
「SpringBrick快速入门指南」:一款基于Spring Boot的高级插件化开发框架
52 0
|
1月前
|
XML 存储 前端开发
手动开发-实现SpringMVC底层机制--小试牛刀
手动开发-实现SpringMVC底层机制--小试牛刀
14 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
46 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
79 0