利用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
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
6 1
|
1天前
|
前端开发 Dubbo Java
spring面试题_spring mvc面试题_springboot面试题库
spring面试题_spring mvc面试题_springboot面试题库
|
3天前
|
JSON 前端开发 Java
【JavaEE进阶】 关于Spring MVC 响应
【JavaEE进阶】 关于Spring MVC 响应
14 3
|
5天前
|
缓存 NoSQL Java
在 SSM 架构(Spring + SpringMVC + MyBatis)中,可以通过 Spring 的注解式缓存来实现 Redis 缓存功能
【6月更文挑战第18天】在SSM(Spring+SpringMVC+MyBatis)中集成Redis缓存,涉及以下步骤:添加Spring Boot的`spring-boot-starter-data-redis`依赖;配置Redis连接池(如JedisPoolConfig)和连接工厂;在Service层使用`@Cacheable`注解标记缓存方法,指定缓存名和键生成策略;最后,在主配置类启用缓存注解。通过这些步骤,可以利用Spring的注解实现Redis缓存。
23 2
|
4天前
|
前端开发 Java 应用服务中间件
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
Spring框架第六章(SpringMVC概括及基于JDK21与Tomcat10创建SpringMVC程序)
|
9天前
|
Java Maven Spring
第一个Spring程序(代码篇)
第一个Spring程序(代码篇)
11 1
|
13天前
|
JSON 前端开发 Java
Spring MVC 级联对象参数校验
【6月更文挑战第6天】在 Spring MVC 的使用过程中,我们会发现很多非常符合直觉的功能特性,但往往我们会习惯这种「被照顾得很好」的开发方式,依靠直觉去判断很多功能特性的用法。
17 1
|
1天前
|
前端开发 搜索推荐 Java
【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结
【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结
4 0
|
4天前
|
IDE Java API
如何使用Java和Spring Boot来开发一个基本的RESTful API
如何使用Java和Spring Boot来开发一个基本的RESTful API
10 0
|
4天前
|
前端开发 Java Maven
如何在Spring MVC中实现图片的上传和下载功能
如何在Spring MVC中实现图片的上传和下载功能