SpringMVC【开发Controller】详解(二)

简介: 本文主要是讲解在Controller中的开发

RequestMapping

@RequestMapping能够控制请求路径和请求方式!

一个控制器写多个业务方法

到目前为止,我们都是一个控制器写一个业务方法,这肯定是不合理的。我们在Struts2中一个Action就对应多个业务方法了。那么我们在SpringMVC中又怎么写呢???

其实我们可以推理出来,@RequestMapping就是用于配置哪个请求对应哪个业务方法的!

public @interface RequestMapping {
    String[] value() default {};
    RequestMethod[] method() default {};
    String[] params() default {};
    String[] headers() default {};
}

当我们请求hello.action的时候,处理的业务方法是hello()…..当我们请求bye.action的时候,处理的业务方法是bye()

@Controller
public class HelloAction {
    /**
     *
     * @RequestMapping 表示只要是/hello.action的请求,就交由该方法处理。当然了.action可以去掉
     * @param model 它和ModelAndView类似,它这个Model就是把数据封装到request对象中,我们就可以获取出来
     * @return 返回跳转的页面【真实路径,就不用配置视图解析器了】
     * @throws Exception
     */
    @RequestMapping(value="/hello.action")
    public String hello(Model model) throws Exception{
        System.out.println("HelloAction::hello()");
        model.addAttribute("message","你好");
        return "/index.jsp";
    }
    @RequestMapping(value = "/bye.action")
    public String bye(Model model) throws Exception {
        model.addAttribute("message","再见");
        return "/index.jsp";
    }
}

微信图片_20220411232732.png

分模块开发

当然了,我们在Struts2常常使用namespace来进行分模块开发,在SpringMVC中我们也可以这样干,并且我们又是使用的是@RequestMapping这个注解!

只要把@RequestMapping这个注解写到类上面去,就代表了分模块。

@Controller
//我们知道,如果是value属性上的注解,我们可以把value省略掉的
@RequestMapping("/zhongfucheng")
public class HelloAction {
    /**
     * @param model 它和ModelAndView类似,它这个Model就是把数据封装到request对象中,我们就可以获取出来
     * @return 返回跳转的页面【真实路径,就不用配置视图解析器了】
     * @throws Exception
     * @RequestMapping 表示只要是/hello.action的请求,就交由该方法处理。当然了.action可以去掉
     */
    @RequestMapping(value = "/hello.action")
    public String hello(Model model) throws Exception {
        System.out.println("HelloAction::hello()");
        model.addAttribute("message", "你好");
        return "/index.jsp";
    }
    @RequestMapping(value = "/bye.action")
    public String bye(Model model) throws Exception {
        model.addAttribute("message", "再见");
        return "/index.jsp";
    }
}

那么我们想要HelloAction该控制器处理我们的请求,访问的地址要么是:http://localhost:8080/zhongfucheng/hello.action,或者要么是http://localhost:8080/zhongfucheng/bye.action


限定某个业务控制方法,只允许GET或POST请求方式访问

我们如果想要限定某个业务控制方法,只允许GET或POST请求方式访问。还是通过@RequestMapping来实现。只要设定它的method属性就行了

@RequestMapping(value = "/bye.action",method = RequestMethod.POST)
    public String bye(Model model) throws Exception {
        model.addAttribute("message", "再见");
        return "/index.jsp";
    }

当我把业务方法的请求设置为POST以后,我想要通过GET方式来访问该业务方法。就行不通了!

微信图片_20220411232949.jpg


业务方法写入传统web参数

我们的业务方法除了可以写Model这个参数以外,如果有需要我们还可以写request,response等传统Servlet的参数。这是一样可以使用的….

但是呢,我们并不建议使用传统的web参数,因为会耦合

@RequestMapping(method=RequestMethod.POST,value="/register")
    public String registerMethod(HttpServletRequest request,HttpServletResponse response) throws Exception{
        //获取用户名和薪水
        String username = request.getParameter("username");
        String salary = request.getParameter("salary");
        System.out.println("用户注册-->" + username + ":" + salary);
        //绑定到session域对象中
        request.getSession().setAttribute("username",username);
        request.getSession().setAttribute("salary",salary);
        //重定向/jsp/success.jsp页面
        //response.sendRedirect(request.getContextPath()+"/jsp/success.jsp");
        //转发/jsp/ok.jsp页面
        request.getRequestDispatcher("/jsp/ok.jsp").forward(request,response);
        //转发(提倡)
        return "/jsp/success.jsp";
    }

小细节:如果我们的返回值是返回一个真实路径,而我们在程序中又使用了转发或重定向。。。那么具体跳转的位置就是按我们程序中跳转的路径为准

业务方法收集参数

我们在Struts2中收集web端带过来的参数是在控制器中定义成员变量,该成员变量的名字与web端带过来的名称是要一致的…并且,给出该成员变量的set方法,那么Struts2的拦截器就会帮我们自动把web端带过来的参数赋值给我们的成员变量….

那么在SpringMVC中是怎么收集参数的呢????我们SpringMVC是不可能跟Struts2一样定义成员变量的,因为SpringMVC是单例的,而Struts2是多例的。因此SpringMVC是这样干的:

  • 业务方法写上参数
  • 参数的名称要和web端带过来的数据名称要一致

接收普通参数

如果是普通参数的话,我们直接在方法上写上与web端带过来名称相同的参数就行了!

<form action="${pageContext.request.contextPath}/hello.action" method="post">
    <table align="center">
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="username"></td>
        </tr>
        <tr>
            <td>编号</td>
            <td><input type="text" name="id"></td>
        </tr>
        <tr>
            <td colspan="2">
                <input type="submit" value="提交">
            </td>
        </tr>
    </table>
</form>
@RequestMapping(value = "/hello.action")
    public String hello(Model model, String username, int id) throws Exception {
        System.out.println("用户名是:" + username);
        System.out.println("编号是:" + id);
        model.addAttribute("message", "你好");
        return "/index.jsp";
    }

效果:

微信图片_20220411233000.jpg

目录
相关文章
|
1月前
|
XML 存储 前端开发
手动开发-实现SpringMVC底层机制--小试牛刀
手动开发-实现SpringMVC底层机制--小试牛刀
14 0
|
6月前
|
存储 JSON 前端开发
利用Spring MVC开发程序2
利用Spring MVC开发程序
47 1
|
6月前
|
JSON 网络架构 数据格式
SpringMVC -- REST风格开发,RESTful快速开发、RESTful注解开发
SpringMVC -- REST风格开发,RESTful快速开发、RESTful注解开发
81 2
|
6月前
|
设计模式 JSON 前端开发
利用Spring MVC开发程序1
利用Spring MVC开发程序
55 0
|
6月前
|
JSON 前端开发 Java
开发必备技能:探索Spring MVC请求映射和参数绑定的奇妙之旅!
开发必备技能:探索Spring MVC请求映射和参数绑定的奇妙之旅!
|
6月前
|
设计模式 前端开发 Java
Spring Boot之Spring MVC的工作原理 以及使用eclipse开发Spring MVC的Web应用实战(附源码)
Spring Boot之Spring MVC的工作原理 以及使用eclipse开发Spring MVC的Web应用实战(附源码)
92 0
|
6月前
|
前端开发
SpringMVC-RESTful快速开发及案例:基于RESTful页面数据交互
SpringMVC-RESTful快速开发及案例:基于RESTful页面数据交互
77 0
|
消息中间件 前端开发 Java
GitHub标星30k!基于Spring MVC Mybatis分布式开发系统-zheng项目
zheng项目不仅仅是一个开发架构,而是努力打造一套从 前端模板 - 基础框架 - 分布式架构 - 开源项目 - 持续集成 - 自动化部署 - 系统监测 - 无缝升级 的全方位J2EE企业级开发解决方案。
|
SQL JSON 前端开发
SpringMvc+Spring+MyBatis+Maven+Ajax+Json注解开发 利用Maven的依赖导入不使用架包模式 (实操十二)
SpringMvc+Spring+MyBatis+Maven+Ajax+Json注解开发 利用Maven的依赖导入不使用架包模式 (实操十二)
77 0
|
JSON 前端开发 Java
SpringMvc+Spring+MyBatis+Maven+Ajax+Json注解开发 利用Maven的依赖导入不使用架包模式 (实操十一)
SpringMvc+Spring+MyBatis+Maven+Ajax+Json注解开发 利用Maven的依赖导入不使用架包模式 (实操十一)
85 0