文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring MVC中@Controller和@RequestMapping注解使用

2024-04-02 19:55

关注

@Controller和@RequestMapping注解使用

RequestMapping 注解类型

1)方法级别注解

@RequestMapping(value = "/index/login")
public String login() {

return "login";
}

2)类级别注解

@RequestMapping("/index")
public class IndexController {
}

通过 @RequestParam 接收请求参数

@RequestMapping("/register")

public String register(@RequestParam String uname,
    @RequestParam String upass, Model model) {
    if ("zhangsan".equals(uname) && "123456".equals(upass)) {
        logger.info("成功");
        return "login"; // 注册成功,跳转到 login.jsp
    } else {
        // 在register.jsp页面上可以使用EL表达式取出model的uname值
        model.addAttribute("uname", uname);
        return "register"; // 返回 register.jsp
    }
}
@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {
    if ("zhangsan".equals(uname) && "123456".equals(upass)) {
        logger.info("成功");
        return "login"; // 注册成功,跳转到 login.jsp
    } else {
        logger.info("失败");
        // 使用@ModelAttribute("user")与model.addAttribute("user",user)的功能相同
        //register.jsp页面上可以使用EL表达式${user.uname}取出ModelAttribute的uname值
        return "register"; // 返回 register.jsp
    }
}

Spring MVC应用@Autowired和@Service进行依赖注入

<context:component-scan base-package="service" />

通过 org.springframework.web.bind.annotation.ModelAttribute

注解类型可经常实现以下两个功能:

1.绑定请求参数到实体对象(表单的命令对象)

@RequestMapping("/register")
public String register(@ModelAttribute("user") UserForm user) {
    if ("zhangsan".equals(uname) && "123456".equals(upass)) {
        logger.info("成功");
        return "login";
    } else {
        logger.info("失败");
        return "register";
}

在上述代码中“@ModelAttribute("user")UserForm user”语句的功能有两个:

将请求参数的输入封装到 user 对象中。

创建 UserForm 实例。

以“user”为键值存储在 Model 对象中,和“model.addAttribute("user",user)”语句的功能一样。如果没有指定键值,即“@ModelAttribute UserForm user”,那么在创建 UserForm 实例时以“userForm”为键值存储在 Model 对象中,和“model.addAtttribute("userForm", user)”语句的功能一样。

2.注解一个非请求处理方法 

被 @ModelAttribute 注解的方法将在每次调用该控制器类的请求处理方法前被调用。这种特性可以用来控制登录权限,当然控制登录权限的方法有很多,例如拦截器、过滤器等。

拦截器的配置 

让自定义的拦截器生效需要在 Spring MVC 的配置文件中进行配置,配置示例代码如下:

<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 配置一个全局拦截器,拦截所有请求 -->
    <bean class="interceptor.TestInterceptor" /> 
    <mvc:interceptor>
        <!-- 配置拦截器作用的路径 -->
        <mvc:mapping path="
@RequestMapping(value = { "itemList", "itemListAll" })
public ModelAndView queryItemList() {
    // 查询商品数据
    List<Item> list = this.itemService.queryItemList(); 
    // 创建ModelAndView,设置逻辑视图名
    ModelAndView mv = new ModelAndView("itemList"); 
    // 把商品数据放到模型中
    mv.addObject("itemList", list);
    return mv;
}

2. 添加在类上面

在class上添加@RequestMapping(url)指定通用请求前缀,限制此类下的所有方法请求url必须以请求前缀开头

可以使用此方法对url进行分类管理,如下图:

此时需要进入queryItemList()方法的请求url为:http://127.0.0.1:8080/api/item/itemList.action

或者

http://127.0.0.1:8080/api/item/itemListAll.action

3.请求方法限定

除了可以对url进行设置,还可以限定请求进来的方法。不写的话默认所有方法都可以。

(1)限定GET方法

@RequestMapping(method = RequestMethod.GET)

如果通过POST访问则报错:

HTTP Status 405 - Request method 'POST' not supported

例如:

@RequestMapping(value = "itemList",method = RequestMethod.POST)

(2)限定POST方法

@RequestMapping(method = RequestMethod.POST)

如果通过GET访问则报错:

HTTP Status 405 - Request method 'GET' not supported

(3)GET和POST都可以

@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

Controller方法返回值

1. 返回ModelAndView --无敌的,带着数据,返回视图路径

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

@RequestMapping(value = "/item/itemlist.action")
public ModelAndView itemList(){     
    // 从MySQL中查询数据
    List<Items> list = itemService.selectItemsList(); 
    // 创建ModelAndView,用来存放数据和视图
    ModelAndView mav = new ModelAndView();
    // 设置数据到模型中
    mav.addObject("itemList", list); //页面上循环的是itemList
    // 设置视图的路径,需要设置视图的物理地址
    //mav.setViewName("/WEB-INF/jsp/itemList.jsp");
    mav.setViewName("itemList"); //在springmvc.xml中替换掉默认的视图解析器 
    return mav;
}

2. 返回void --数据通过形参 Model model 或者 ModelMap model,但是没办法return视图。

如果需要返回视图得通过request或response。这种比较适合ajax请求,但是给ajax返回数据得json格式数据。

在Controller方法形参上可以定义request和response,使用request或response指定响应结果:

(1)使用request转发页面,如下:

request.getRequestDispatcher("页面路径").forward(request, response);
request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

(2)可以通过response页面重定向:

response.sendRedirect("url")
response.sendRedirect("/itemEdit.action");

(3)可以通过response指定响应结果,例如响应json数据如下:

response.getWriter().print("{\"abc\":123}");

代码:


@RequestMapping("queryItem")
public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 1 使用request进行转发
    // request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,
    // response);
 
    // 2 使用response进行重定向到编辑页面
    // response.sendRedirect("/springmvc-web2/itemEdit.action");
 
    // 3 使用response直接显示
    response.getWriter().print("{\"abc\":123}");
}

【注意】:改映射@RequestMapping、改方法名、改方法形参、改返回值都需要重启程序,其他不需要重启。

3.返回字符串(官方推荐此种方式) --返回视图路径,数据通过形参 Model model 或者 ModelMap model

(1)逻辑视图名

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp
return "itemList";

示例代码:


@RequestMapping("/itemEdit.action")
public String queryItemById(Integer id, ModelMap model) { //不要用int,万一传进来一个long
    // 根据id查询商品数据
    Items item = this.itemService.selectItemsById(id);
 
    // 把商品数据放在模型中
    model.addAttribute("item", item);
 
    return "editItem";
}

(2)Redirect重定向

Contrller方法返回字符串可以重定向到一个url地址。

如下商品修改提交后重定向到商品编辑页面。


 @RequestMapping("updateItem")
 public String updateItemById(Items item) {
     // 更新商品
     this.itemService.updateItemById(item);
 
     // 修改商品成功后,重定向到商品编辑页面
     // 重定向后浏览器地址栏变更为重定向的地址,
     // 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
     // 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数
     return "redirect:/itemEdit.action?itemId=" + item.getId();
 }

(3)forward转发

Controller方法执行后继续执行另一个Controller方法

如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。


@RequestMapping("updateItem")
public String updateItemById2(Items item) {
    // 更新商品
    this.itemService.updateItemById(item);
 
    // 修改商品成功后,重定向到商品编辑页面
    // 重定向后浏览器地址栏变更为重定向的地址,
    // 重定向相当于执行了新的request和response,所以之前的请求参数都会丢失
    // 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数
    // return "redirect:/itemEdit.action?itemId=" + item.getId();
 
    // 修改商品成功后,继续执行另一个方法
    // 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,
    // 转发并没有执行新的request和response,所以之前的请求参数都存在
    return "forward:/itemEdit.action"; 
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯