03-SpringMVC

问题描述:以前使用Spring时,我们不能简化servlet的操作,所以使用SpringMVC帮助我们解决这个问题.

一.SpringMVC简介

关于MVC模式的介绍:https://www.cnblogs.com/qiong2017/p/7675224.html

 1.SpringMVC重要组件介绍

DispatcherServlet 前端控制器(核心组件)

HandlerMapping 处理映射器(判断调用哪个Handler)

HandlerAdapter 调度器(负责具让Handler运行)

ViewResovler 视图解析器(负责解析具体往哪里跳转)

2.SpringMVC运行原理(这里有不少好的博客)

https://www.cnblogs.com/xiaoxi/p/6164383.html

https://www.douban.com/note/684837479/

https://blog.csdn.net/qq_39470733/article/details/80980320

我的描述:
1.用户发送请求
2.前端控制器DispatcherServlet(它也是一个servlet想象和以前配置的servlet功能相同)
3.处理用户请求后(获取url和参数...),它让HandlerMappering(处理映射器)根据这个url查找合适的适配器(handler)
4.把上次的处理结果传给适配器(HandlerAdapter),让它帮住我们查找使用哪个controller(就是我们在控制器(controller中配置的方法,找到合适的方法))
5.它找到后,会执行返回(ModelAndView),
6.DispatcherServlet再把它发给ViewResolver,处理成视图后经过渲染,送给用户浏览器显示
图片:

 

SpringMVC容器是Spring容器的子容器,可以调用Spring容器的所有内容.

二.SpringMVC环境搭建

1.导jar

2.配置DispatcherServlet

3.创建SpringMVC的配置文件springmvc.xml

4.编写控制器

详细:

1.导入jar

jackson是帮助输出流内容转换为json格式用的,其他除了核心包,就是必备包

2.在web.xml中配置DispatcherServlet

<servlet-name>随意起名

<servlet-class>固定配置

<init-param>帮助SpringMVC查找配置文件位置,在这里就可以自己配置;如图:classpath:springmvc.xml(意思就是src下的一个名叫springmvc.xml的文件)

其他的配置请看代码之中

    <servlet>
		<servlet-name>springmvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 初始化文件位置,否则配置麻烦 -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:springmvc.xml</param-value>
		</init-param>
		<!-- 服务器启动后加载顺序 -->
		<load-on-startup>1</load-on-startup>
	</servlet>
	<!-- 拦截出了jsp页面的所有页面 -->
	<servlet-mapping>
		<servlet-name>springmvc</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

3.创建springmvc.xml

① 引入命名空间:一个context,一个mvc

    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd

② 我使用注解配置方法,所以需要注解驱动以及扫描器

<!-- 我们使用注解,因此需要注解扫描 -->
<context:component-scan base-package="com.sshqx.controller"></context:component-scan>
<!-- 注解驱动 -->
<!--org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping -->
<!--org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 静态资源 -->
<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>

4.使用注解配置控制器

@Controller
public class DemoController {
	
	@RequestMapping("demo1")
	public String demo1(@RequestParam("name")String name1,@RequestParam("age")Integer age1){
		System.out.println("执行demo1");
		System.out.println("demo1的参数为:"+name1+"-->"+age1);
		return "main.jsp";
	}
	@RequestMapping("demo2")
	public String demo2(){
		System.out.println("执行demo2");
		return "main.jsp";
	}
	
}

三.web.xml配置字符编码过滤器

<url-pattern>中 /* 拦截所有 / 不拦截jsp

<!-- 配置过滤器,设置编码格式 -->
	<filter>
		<filter-name>encoding</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>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

四.传递参数

给控制器传递参数

1. 把内容写到方法(HandlerMethod)参数中,SpringMVC 只要有这个内容,注入内容.

2. 基本数据类型参数

2.1 默认保证参数名称和请求中传递的参数名相同

@Controller

public class DemoController {

@RequestMapping("demo")

public String demo(String name,int age){

System.out.println("执行 demo"+" "+name+" "+age);

             return "main.jsp";

}

}

2.2 如果请求参数名和方法参数名不对应使用@RequestParam()赋值

@RequestMapping("demo")

public String demo(@RequestParam(value="name1") String name,@RequestParam(value="age1")int age){

System.out.println("执行 demo"+" "+name+" "+age);

return "main.jsp";

}

2.3              (      )    

@RequestParam 设置默认值.

2.3.1 防止没有参数时 500

@RequestMapping("page")

public String page(@RequestParam(defaultValue="2")

int pageSize,@RequestParam(defaultValue="1") int

pageNumber){

System.out.println(pageSize+" "+pageNumber);

return "main.jsp";

}

 

2.4 如果强制要求必须有某个参数

@RequestMapping("demo2")

public String demo2(@RequestParam(required=true) String name){

System.out.println("name  SQL 的查询条件,必须要传递 name 参数"+name);

return "main.jsp";

}

3. HandlerMethod 中参数是对象类型

3.1 请求参数名和对象中属性名对应(get/set 方法)

@RequestMapping("demo4")

public String demo4(People peo){

return "main.jsp";

}

4. 请求参数中包含多个同名参数的获取方式

4.1 复选框传递的参数就是多个同名参数

@RequestMapping("demo5")

public String demo5(String name,int age,@RequestParam("hover")List<String> abc){

System.out.println(name+" "+age+" "+abc);

return "main.jsp";

}

 

5. 请求参数中对象.属性格式

5.1 jsp 中代码

<input type="text" name="peo.name"/>

<input type="text" name="peo.age"/>

5.2 新建一个类

5.2.1 对象名和参数中点前面名称对应

public class Demo {

private People peo;

5.3 控制器

@RequestMapping("demo6")

public String demo6(Demo demo){

System.out.println(demo);

return "main.jsp";

}

6. 在请求参数中传递集合对象类型参数

6.1 jsp 中格式

<input type="text" name="peo[0].name"/>

<input type="text" name="peo[0].age"/>

<input type="text" name="peo[1].name"/>

<input type="text" name="peo[1].age"/>

6.2 新建类

public class Demo {

private List<People> peo;

6.3 控制器

@RequestMapping("demo6")

public String demo6(Demo demo){

System.out.println(demo);

return "main.jsp";

}

7. restful 传值方式.

7.1 简化 jsp 中参数编写格式

7.2  jsp 中设定特定的格式

<a href="demo8/123/abc">跳转</a>

7.3 在控制器中

7.3.1 @RequestMapping 中一定要和请求格式对应

7.3.2 {名称} 中名称自定义名称

7.3.3 @PathVariable 获取@RequestMapping 中内容,默认按照方法参数名称去寻找.

@RequestMapping("demo8/{id1}/{name}")

public String demo8(@PathVariable String name,@PathVariable("id1") int age){

System.out.println(name +" "+age);

return "/main.jsp";

}

.跳转方式

1. 默认跳转方式请求转发.

2. 设置返回值字符串内容,return语句

2.1 添加 redirect:资源路径 重定向

       2.2 添加 forward:资源路径 或省略 forward: 转发

六.视图解析器

1.Spring默认提供

2.程序员自己配置(springmvc.xml中)


<!-- 自定义视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

3.使用效果

原来的跳转:

return "main.jsp";

配置之后:

return "main";

4. 如果希望不执行自定义视图解析器,在方法返回值前面添加

forward: redirect:

 七.@ResponseBody

1. 在方法上只有@RequestMapping ,无论方法返回值是什么认为需要跳转

2. 在方法上添加@ResponseBody(恒不跳转)

2.1 如果返回值满足 key-value 形式(对象或 map)

2.1.1 把响应头设置为 application/json;charset=utf-8

2.1.2 把转换后的内容输出流的形式响应给客户端.

2.2 如果返回值不满足 key-value,例如返回值为 String

2.2.1 把相应头设置为 text/html

2.2.2 把方法返回值以流的形式直接输出.

2.2.3 如果返回值包含中文,出现中文乱码

2.2.3.1 produces 表示响应头中 Content-Type 取值.

@RequestMapping(value="demo12",produces="text/html;charset=utf-8")

       @ResponseBody

public String demo12() throws IOException{

People p = new People();

p.setAge(12);

p.setName("张三");

return "中文";

}

3. 底层使用 Jackson 进行 json 转换,在项目中一定要导入 jackson  jar

3.1 spring4.1.6  jackson 不支持较高版本,jackson 2.7 无效.

第二天

一.SpringMVC 作用域传值的几种方式

     9大内置对像以及4大作用域比较重要,(其实常用的内置对象并不多,四五个左右,作用域都重要)

1.原生servlet这个就不多说了

2.HandlerMethod参数添加作用域对象

方式一:

	@RequestMapping("demo12")
	public String demo12(HttpServletRequest req,HttpSession hs){
		//使Request传值
		req.setAttribute("req", "鸡你太美");
		
		//使用Session
		hs.setAttribute("hs", "打篮球");
		HttpSession session = req.getSession();
		session.setAttribute("session", "呜呼");
		
		//使用context
		ServletContext context = req.getServletContext();
		context.setAttribute("context", "蔡XX");
		return "forward:/index.jsp";
	}

方式二:

使用Map集合 或者Model(注意:Model底层使用Request传递)

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值