Spring之Controller

Spring之Controller

1、@Controller

以返回字符串的形式返回

@Controller
@RequestMapping("test")
public class TestController {
    @Autowired
    UserService userService;
    @RequestMapping("selectAllUsername")
    public String t1(Model model){
        List<String> stringList = userService.selectAllUsername();
        model.addAttribute("msg",stringList);
        return "test";
    }
    @RequestMapping("selectUsernameByUid")
    public String t2(@RequestParam("uid") int uid, Model model){
        String username = userService.selectUsernameByUid(uid);
        model.addAttribute("msg",username);
        return "test";
    }
}

请求test/selectAllUsernametest/selectUsernameByUid就能访问到

以ModelAndView返回:

	@RequestMapping("selectAllUser")
    public ModelAndView t3(){
        ModelAndView modelAndView = new ModelAndView();
        List<User> userList = userService.selectAllUser();
        modelAndView.addObject("msg",userList);
        modelAndView.setViewName("test");
        return modelAndView;
    }

新建一个ModelAndView对象,然后把数据用ModelAndView的addObject方法存到msg里,再用ModelAndView的setViewName的方法设置返回的页面最后再返回ModelAndView对象。

以字符串形式返回:

	@RequestMapping("selectAllUser")
    public String t3(Model model){
        List<User> userList = userService.selectAllUser();
        model.addAttribute("msg",userList);
        return "test";
    }	

直接获得一个Model对象,然后用Model的addAttribute存到msg里,最后直接return一个我们需要显示的视图就行了,个人比较推荐第二种。

2、Post提交和Get提交

Get提交:@RequestMapping(value = "selectUsernameByUid",method = RequestMethod.GET)等价于@GetMapping("selectUsernameByUid")

同理Post提交:@RequestMapping(value = "selectUsernameByUid",method = RequestMethod.POST)等价于@PostMapping("selectUsernameByUid")

建议直接写@PostMapping或者@GetMapping

3、Restful风格

平时我们的地址栏传参是用的selectUsernameByUid?uid=1&username=wqk用的是?&符号传递参数,但是为了安全性和迷惑性,基本上都是使用的Restful风格的地址栏请求方式:比如百度百科:在这里插入图片描述

就是用的Restful风格传参,那么在控制器层怎么实现呢:

	@RequestMapping("selectUsernameByUid/{uid}")
    public String t2(@PathVariable("uid") int uid, Model model){
        String username = userService.selectUsernameByUid(uid);
        model.addAttribute("msg",username);
        return "test";
    }

只需要在@RequestMapping注解里加个/{参数},然后再在需要在前端接收的参数那里加个

@PathVariable就可以实现了,看效果:

在这里插入图片描述

直接用selectUsernameByUid/1就能请求了,而不是selectUsernameByUid?uid=1

4、返回JSON

JSON是一种数据交换格式类似键值对

[
    {
        "sid":10001,
    	 "text":"南粉北面"
    }
]

JSON的话就是真正意义上的前后端分离了,前端只需要向后端发起请求然后后端返回JSON,前端然后用JavaScript将JSON进行处理就行了。

需要用到JSON的话我们就需要导入关于JSON的依赖:

	<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.60</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.8</version>
    </dependency>

一个是Jackson,另一个阿里巴巴的fastjson

同时我们还需要在spring-mvc.xml文件里导入

<mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

对JSON数据进行乱码处理,不然返回给前端的中文基本是乱码。

这样我们就可以在控制器里返回JSON了

@Controller
@RequestMapping("json")
public class JsonController {
    @Autowired
    UserService userService;
    @RequestMapping("j1")
    @ResponseBody
    public String j1(){
        List<User> userList = userService.selectAllUser();
        String string = JSON.toJSONString(userList);
        return string;
    }
}

要想实现只返回JSON对象(实质就是字符串的一种特殊形式)的话就必须给方法上加上@Controller@ResponseBody注解,那么就可以用return直接返回字符串给前端了。

还有另外一种方式也可以实现,同时也比较推荐这种:

@RestController
@RequestMapping("json")
public class JsonController {
    @Autowired
    UserService userService;
    @RequestMapping("j1")
    public String j1(){
        List<User> userList = userService.selectAllUser();
        String string = JSON.toJSONString(userList);
        return string;
    }
}

直接加上@RestController注解就行了。

@Controller+@ResponseBody<==>@RestController

我们现在完全不需要关心返回某个视图了,因为前端只需要向我后端提交某个请求,然后给前端返回数据就行了。真正做到了前后端分离。

JSON.toJSONString(Object o)//把对象转换成JSON对象

在这里插入图片描述

5、获取HttpServletRequest对象

在Spring的控制器里其实也可以获得Session对象:

@RequestMapping("t4")
    public String t4(HttpServletRequest request, HttpServletResponse response){
        String uid = request.getParameter("uid");
        HttpSession session = request.getSession();
        response.sendRedirect("test");
        return "test";
    }

我们只需要像以前的Servlet一样,获取到HttpServletRequest,然后用request.getParameter就可以像以前一样获取参数了,也可以用getSession获取到session对象,同时还可以使用response.sendRedirect方法进行重定向。这里就跟以前完全一摸一样,因为其实Controller控制器本身还是一个Servlet而已。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值