SpringMVC

发布于:2024-05-10 ⋅ 阅读:(29) ⋅ 点赞:(0)

一、简介

1.MVC:

M Model ,模型层,指工程中的 JavaBean ,作用是处理数据
JavaBean 分为两类:
一类称为实体类 Bean :专门存储业务数据的,如 Student User
一类称为业务处理 Bean :指 Service Dao 对象,专门用于处理业务逻辑和数据访问。
V View ,视图层,指工程中的 html jsp 等页面,作用是与用户进行交互,展示数据
C Controller ,控制层,指工程中的 servlet ,作用是接收请求和响应浏览器
注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台
servlet
springMVC封装的就是servlet
url-pattern中的路径:
1./*可以匹配浏览器向服务器发送的任意请求
2./不可匹配以.jsp结尾的请求,jsp的本质是Servlet

2.入门案例

视图前缀+逻辑视图+视图后缀=物理视图

3.web.xml的配置

<!--           设置SpringMVC配置文件的位置和名称-->
        <init-param>
            <!--初始化参数
            contextConfigLocation:指定Springmvc配置文件位置

             -->
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 定义启动顺序:数值越小优先级越高,(越早创建 )
        将DispatcherServlet的初始化时间提前到服务器启动时   -->
        <load-on-startup>1</load-on-startup>

4.总结

浏览器发送请求,若请求地址符合前端控制器的 url-pattern ,该请求就会被前端控制DispatcherServlet处理。前端控制器会读取 SpringMVC 的核心配置文件,通过扫描组件找到控制器, 将请求地址和控制器中@RequestMapping 注解的 value 属性值进行匹配,若匹配成功,该注解所标识的控制器方法就是处理请求的方法。处理请求的方法需要返回一个字符串类型的视图名称,该视图名称会被视图解析器解析,加上前缀和后缀组成视图的路径,通过Thymeleaf 对视图进行渲染,最终转发到视图所对应页面。

二、详解

1.@RequestMapping注解的位置

a>标识到一个类上:设置映射请求的请求路径的初始信息

b>标识到一个方法上:设置映射请求的请求路径的具体信息

@Controller
@RequestMapping("/test")
public class TestRequestMappingController {
//    此时控制器方法所匹配的请求的请求路径为/test/hello
    @RequestMapping("/hello")
    public String hello(){
        return "success";
    }
}

2.@RequestMapping注解的value属性

一个servlet来处理多个请求

作用:通过请求的请求路径匹配请求

value属性是一个数组类型,即当前浏览器所发送的请求路径匹配value属性中的任何一个值

则当前请求就会被注解所标识的方法进行处理

    @RequestMapping({"/hello","/abc"})

3.@RequestMapping注解的method属性

作用:通过请求的请求方式匹配请求

method属性是RequestMethod(枚举)类型的数组,

即当前浏览器所发送的请求方法匹配method属性中的任何一个值

则当前请求就会被注解所标识的方法进行处理

表单提交,将method设置为post,剩余全是get,比如地址栏输入地址来发送请求

 @RequestMapping(
            value = {"/hello","/abc"},
            method = RequestMethod.GET
            params = {"username"}
 )

注意:若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但请求方式不匹配,此时页面报错:405--Request method 'GET' not supported

4.@RequestMapping注解的params属性

在@RequestMapping的基础上,结合请求方式的一些派生注解:

@GetMapping,@PostMapping,@DeleteMapping,@PutMapping

作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置。

params可以使用四种表达式:

“param”:表示当前所匹配请求的请求参数中必须携带params参数

“!param”:表示当前所匹配请求的请求参数中一定不能携带params参数

“param=value”:表示当前所匹配请求的请求参数中必须携带params参数且值必须为value

“param!=value”:表示当前所匹配请求的请求参数中可以不携带params参数,若携带,值一定不能是value

<a th:href="@{/hello(username='admin')}">测试测试注解</a>
<a th:href="@{/hello?username=value}">测试注解</a>

注意:若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但请求参数不匹配,此时页面报错:400-- Parameter conditions "username" not met for actual request parameters: usename={admin}

5.@RequestMapping注解的headers属性(与params的用法啊一样)

@RequestMapping 注解的 headers 属性通过请求的请求头信息匹配请求映射
@RequestMapping 注解的 headers 属性是一个字符串类型的数组,可以通过四种表达式设置请求头信
息和请求映射的匹配关系
"header" :要求请求映射所匹配的请求必须携带 header 请求头信息
"!header" :要求请求映射所匹配的请求必须不能携带 header 请求头信息
"header=value" :要求请求映射所匹配的请求必须携带 header 请求头信息且 header=value
"header!=value" :要求请求映射所匹配的请求必须携带 header 请求头信息且 header!=value
若当前请求满足 @RequestMapping 注解的 value method 属性,但是不满足 headers 属性,此时页面 显示404 错误,即资源未找到
注意:请求头和响应头的键不区分大小写,值区分大小写

6.SpringMVC支持ant风格的路径

路径中最好不要出现大写字母
在路径中,?是路径与请求参数的分隔符
在@RequestMapping注解的value属性值中设置一些特殊字符:
?:任意的单个字符(不包括?)
*:任意个数的任意字符(不包括?和/)
**:任意层数的任意目录,注意使用方式只能/**/,且**前后不能有任何的其他字符

7.SpringMVC使用路径中的占位符

原始方式: /deleteUser?id=1
rest 方式: /user/delete/1
<a th:href="@{/test/rest/1}">测试注解</a>


@RequestMapping("/test/rest/{id}")
    public String testRest(@PathVariable("id") Integer id){
        return "success";

}

8.通过servletAPI获取请求参数(用的不多)

只要在控制器方法的形参中设置HttpServletRequest类型的形参

就可以在控制器方法中使用request对象获取请求参数

public class TestParamController {
    @RequestMapping("/param/servletAPI")
    public  String getParamByServletAPI(HttpServletRequest request){
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        System.out.println(username+" "+password);
        return "success";
    }

9.多种方法获取请求参数

<a>通过控制器方法的形参获取

只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可

@RequestMapping("/param")
    public String testParam(String username,String password){
        System.out.println(username+","+password);
        return "success";

    }

<b>@RequestParam:将请求参数与控制器方法的形参绑定

@RequestParam注解的三个属性:value,required,defaultValue

value:设置和形参绑定的请求参数的名字

required:设置是否必须传输value所对应的请求参数

默认值是true,表示必须传输value所对应的请求参数,否则页面报错400

若设置为false,则表示不是必须传输value所对应的请求参数,若未传输,则形参值为null

defaultValue:设置当没有传输value所对应的请求参数时,为形参设置默认值,此时和required属性值无关

<c>@RequestHeader:将请求头信息和控制器方法的形参绑定

@CookieValue:将cookie数据和控制器方法的形参绑定

<d>通过pojo获取请求参数

可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实 体类中的属性名一致,那么请求参数就会为此属性赋值
@RequestMapping("/testpojo")
public String testPOJO(User user){
System.out.println(user);
return "success";

10.解决获取请求参数的乱码问题

设置编码之前一定不能获取任何的请求参数,

注:处理编码的过滤器一定要配置到其他过滤器之前,否则无效

在web.xml中配置Spring的编码过滤器

 <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

11.域对象共享数据

①使用ServletAPI向request域对象共享数据

掌握如何在控制器方法中设置request对象

②使用ModelAndView(类)向request域对象共享数据

@Controller
public class TestScopeController {
    @RequestMapping("test/mav")
    public ModelAndView testMAV(){
/**
 * ModelAndView 包含Model和view的功能
 * Model:向请求域中共享数据
 * View:设置逻辑视图实现页面跳转
 * 
 * */

ModelAndView mav =new ModelAndView();
mav.addObject("testRequestScope","hello,ModelAndView");
mav.setViewName("success");
return mav;
    }
}

③使用Model,ModelMap,Map向请求域中共享数据

其实在底层中,这些类型的形参最终通过Binding Aware Model Map()创建

@RequestMapping("/test/model")
    public String testModel(Model model){
        model.addAttribute("testRequestScope","hello,Model");
        return "success";
    }
    @RequestMapping("/test/modelMap")
    public String testModelMap(ModelMap modelMap){
        modelMap.addAttribute("testRequestScope","hello,ModelMap");
        return "success";
    }
    @RequestMapping("/test/map")
    public String testMap(Map<String ,Object> map){
        map.put("testRequestScope","hello,map");
        return "success";
    }

④向会话域和应用域共享数据

建议用servletAPI中的方法

Thymeleaf中获取

1.request域中的数据要用${域的名称}

2.session域中的数据要用${session.AttributeName}(与浏览器是否关闭有关)

3.application域中要用${application.AttributeName}(与服务器是否关闭有关)


网站公告

今日签到

点亮在社区的每一天
去签到