springfMVC学习笔记——ModelAndView、自定义配置文件位置、设置编码方式

本文详细介绍了SpringMVC中ModelAndView类的使用,包括三种向Request域存储数据的方法,如使用ModelAndView对象、传入Map对象和Model对象。同时,解释了视图类型,如InternalResourceView、JstlView和RedirectView,以及视图优先级的设置。此外,还讲解了如何向Session域中存储和清除数据,以及自定义SpringMVC配置文件位置和设置编码方式的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ModelAndView 类

三种向 Request 域中存储数据的方式

  1. 使用 ModelAndView 对象,使用方法:
    addObjetct(String attributeName, String attributeValue) 存储数据
    setViewName(String viewName) 设置视图名称
  2. 向形参中传入 Map 对象,在方法内向 Map 对象内保存数据
  3. 向形参中传入 Model 对象,在方法内向使用 Model 对象的方法:
    addAttribute(String attributeName, String attributeValue) 存储数据

使用 ModelAndView 对象

ModelAndView 类中提供方法:

方法作用
addObject(String attributeName,Object attributeValue)Request 域中存储数据
setViewName(String viewName)设置视图名称

注意:在方法内创建 ModelAndView 对象,并向域中保存数据以及设置视图名称等操作,ModelAndView 对象必须返回,执行的操作才会生效。

//方法1:使用 ModelAndView 对象
@RequestMapping("/testModelAndView01")
public ModelAndView testModelAndView01(){
	ModelAndView modelAndView = new ModelAndView();
	//向Request域中保存数据
	modelAndView.addObject("username", "mcc");
	//设置视图名称
	modelAndView.setViewName("success");
	return modelAndView;//ModelAndView对象必须返回,执行的操作才会生效
}

success.jsp 中,能够获取到 Request 域中的数据。

<body>
	<h1>success</h1>
	<h1>${ requestScope.username }</h1>
</body>

形参传入 Map 对象

//方法2:向形参中传入 Map 对象,在方法内向 Map 对象内保存数据
@RequestMapping("/testModelAndView02")
public String testModelAndView02(Map<String,String> map){
	//向 map 中保存数据,就是在向 Request 域中保存数据
	map.put("username", "mcc");
	return "success";
}

形参传入 Model 对象

//方法3:向形参中传入 Model 对象,在方法内向使用 Model 对象的方法保存数据
@RequestMapping("/testModelAndView03")
public String testModelAndView03(Model model){
	//向Request域中保存数据
	model.addAttribute("username", "mcc");
	return "success";
}

视图类型

springMVC 中提供三种类型的视图:

  1. InternalResourceView:转发视图,不能处理包含 JSTL 语法页面
  2. JstlView:转发视图,配合其他视图,处理包含 JSTL 语法的页面
  3. RedirectView:重定向视图

使用方法:在方法的 return 语句中,

  1. return "success";:请求转发视图
  2. return "redirect:/success.jsp":请求重定向视图

SpringMVC 会自动根据返回的视图名称,调用对应的视图类。

注意:重定向是浏览器解析的,浏览器将/解析为http://localhost:8080,因此正常情况下,重定向的地址要在斜杠后添加工程路径,但在 springMVC 的源码中,已经自动添加了工程路径,所以在 springMVC 中,/被服务器和浏览器都解析为http://localhost:8080/工程路径

视图优先级

在配置视图时,通过属性 order,设置视图的优先级,从 1-n 优先级逐渐减小。

<property name="order" value="1"></property>

向 Session 域中存储数据

  1. 向 Session 域中保存数据。
    方法:
    在类上使用@SessionAttributes()注解,当向 Request 域中保存的数据的 key 值满足注解内约束的条件时,会自动将该键值对保存到 Session 域中。

    参数:
    String[] value:要保存到 Session 域中的键值对的 key 值。
    Class<?>[] types:要保存到 Session 域中的键值对的 value 值的类型,要与注解内 value 参数的顺序一致。

    @Controller
    @SessionAttributes(value={"session"}, types={String.class})
    //当向 Request 域中保存 key=session 的键值对,并且 session 的 value 值的类型为 String 时,
    //会自动将该键值对保存到 Session 域中
    public class TestSession {
    	//用于测试向 Session 域中保存数据
    	@RequestMapping(value="/testSession")
    	public String testSession(Model model) {
    		model.addAttribute("session","sessionValue");
    		return "success";
    	}
    }
    
  2. 清空 Session 域中的数据。
    方法:在形参上传入SessionStatus对象,在方法内调用该对象的setComplete()方法即可。

    //清空 Session 域中的数据
    @RequestMapping(value="/testClearSession")
    public String testClearSession(SessionStatus sessionStatus) {
    	sessionStatus.setComplete();
    	return "success";
    }
    

自定义配置文件位置

默认情况下,springMVC 的配置文件存放在 WEB-INF 文件夹下,名称为 DispatchServlet 的<servlet-name>标签值-servlet.xml。

可以在 web.xml 中配置 springMVC 配置文件的位置与名称,方法如下:

  1. 在 servlet 标签中配置初始化参数:<param-name>contextConfigLocation</param-name>
  2. 该参数的值即为 springMVC 配置文件的位置与名称:<param-value>classpath:springMVC.xml</param-value>,其中,classpath 表示工程路径下(与 src 同一级目录),springMVC.xml 为设置的配置文件名称。
  3. 设置在项目加载时,就加载 DispatchServlet:<load-on-startup>一个正整数</load-on-startup>,其中,输入正整数表示在项目加载时就加载该 servlet 程序,若有多个 servlet 程序需要在项目加载时就被加载,数字的大小即为程序的优先级,1 的优先级最大。
    注意:servlet 程序默认在第一次被访问时才被加载,这里设置在项目加载时就被加载。

web.xml

<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet>
	<servlet-name>springDispatcherServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<init-param>
		<!-- 指定 springMVC 配置文件的位置和名称 -->
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:springMVC.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
	<servlet-name>springDispatcherServlet</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

设置编码方式

可以在 web.xml 中配置CharacterEncodingFilter过滤器,通过设置初始化参数encoding的值,设置请求与响应的编码方式。

web.xml

<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>
</filter>
<filter-mapping>
	<filter-name>CharacterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
在Spring Boot中,可以使用application.properties或application.yml文件设置modelandview。以下是两种方法: 1. 使用application.properties文件 在application.properties文件中,可以使用以下语法来设置modelandview: ```properties # 设置modelandview的视图名称 spring.mvc.view.prefix=/templates/ spring.mvc.view.suffix=.html # 设置modelandview的属性 my.view.name=myview my.view.age=20 ``` 在Java代码中,可以使用以下代码来获取modelandview: ```java @RestController public class MyController { @Autowired private Environment env; @GetMapping("/modelandview") public ModelAndView modelandview() { ModelAndView mav = new ModelAndView(env.getProperty("my.view.name")); mav.addObject("age", env.getProperty("my.view.age")); return mav; } } ``` 2. 使用application.yml文件 在application.yml文件中,可以使用以下语法来设置modelandview: ```yaml # 设置modelandview的视图名称 spring: mvc: view: prefix: /templates/ suffix: .html # 设置modelandview的属性 my: view: name: myview age: 20 ``` 在Java代码中,可以使用以下代码来获取modelandview: ```java @RestController public class MyController { @Value("${my.view.name}") private String viewName; @Value("${my.view.age}") private String viewAge; @GetMapping("/modelandview") public ModelAndView modelandview() { ModelAndView mav = new ModelAndView(viewName); mav.addObject("age", viewAge); return mav; } } ``` 注意:在使用application.properties或application.yml文件设置modelandview时,需要注意视图名称的前缀和后缀。在以上示例中,视图名称为myview,视图文件存放在/templates/myview.html文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值