SpringMVC
纯注解式开发
具备IOC和AOP,提供了5中数据提交方式,4种跳转,多个内置对象,简化控制器的处理
优点
-
基于MVC的开发
- MVC是一种开发模式,基于web的开发模式,web开发是基于Servlet的
- M(Model):模型层,数据访问层,业务逻辑层,实体类都属于模型层,进行数据传递和处理的组件
- V(View):视图层,用来进行数据显示的.html,JavaScript,CSS+DIV,Vue,BootStrap,Jsp
- C(controller):控制器,用来接收用户的输入,调用业务逻辑层进行数据处理,并将结果返回到客户端
-
易学易用
- 一直在进行各种优化,上手快
-
核心是IOC和AOP
- 最终的目标依然是解耦合
-
基于注解开发
- 纯注解开发,简化操作
基于注解的SpringMVC的项目
开发步骤
1)新建基于Maven的项目,选择webapp模板
2)修改目录(补充目录结构)
3)修改pom.xml文件,添加Servlet依赖,添加SpringMVC的依赖
<!--pom.xml-->
<dependencies>
<!--添加Servlet的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!--添加SpringMVC的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
</dependencies>
4)修改webapp目录下的文件,添加admin目录,在admin目录下添加main.jsp页面
5)删除index.jsp页面,在webapp目录下新建index.jsp页面
6)添加springmvc.xml配置文件
7)删除web.xml文件,新建,改名
8)在web.xml文件中注册SpringMVC框架
使用DispatcherServlet注册,它是第三方的组件,必须使用标签进行配置
所有的web请求都是基于Servlet的
SpringMVC的控制器是普通方法
index.jsp<===============>核心处理器的Servlet<======分发请求到action======>DemoServlet(DemoAction普通方法)
index.jsp<===============>DispatcherServlet<===============>DemoServlet(DemoAction普通方法)
<!--web.xml-->
<web-app>
<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>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--
设置拦截哪些请求交给DispatcherServlet进行处理
<a href="/demo.action">访问服务器</a>
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
</web-app>
9)开发index.jsp页面,发送请求到action
<a href="/demo.action">访问服务器</a>
10)开发DemoAction
// DemoAction.java
@Controller //交给Spring去创建对象 IOC
public class DemoAction {
/**
* 所有处理交给action方法,它是一个普通的方法
* action方法的规范
* 1)访问权限是public
* 2)方法的返回值任意
* 3)方法的名称自定义
* 4)方法的参数任意
* 5)使用注解@RequestMapping解析访问路径
*
<property name="prefix" value="/admin/"></property>
* <property name="suffix" value=".jsp"></property>
*/
@RequestMapping("/demo")
public String demo() {
System.out.println("服务器被访问到了............");
return "main";
}
}
@RequestMapping注解
1)@RequestMapping注解添加在方法上,为此方法解析一个可访问的名称
2)@RequestMapping注解添加到类上,相当于是报名,用于区分不同类种同名的action
3)@RequestMapping可以区分get请求和post请求
@RequestMapping(value = "/path", method = RequestMethod.GET)
@RequestMapping(value = "/path", method = RequestMethod.POST)
五种数据提交的方式
1)单个数据提交
class java {
/**
* 姓名:<input name="uname"><br>
* 年龄:<input name="uage"><br>
*/
@RequestMapping("/one")
public String one(String uname, int uage) {
System.out.println("提交上来的用户名是:" + uname + ",年龄是:" + (uage + 100) + ".");
return "main";
}
}
2)对象封装提交
class java {
/**
* 实体类:
* private String name;
* private int age;
* 请求参数:
* 姓名:<input name="name"><br>
* 年龄:<input name="age"><br>
*
*/
@RequestMapping("/two")
public String two(Users u) {
System.out.println(u);
return "main";
}
}
3)动态占位符提交
class java {
/**
* 页面:
* <a href="/three/张三/22.action">ResutFul风格</a>
*/
@RequestMapping("/three/{name}/{age1}")
public String three(
@PathVariable
String name,
@PathVariable("age1")
int age) {
System.out.println("提交上来的用户名是:" + name + ",年龄是:" + (age + 100) + ".");
return "main";
}
}
4)映射请求参数
class java {
/**
* 姓名:<input name="name"><br>
* 年龄:<input name="age"><br>
*/
@RequestMapping("/four")
public String four(
@RequestParam("name")
String uname,
@RequestParam("age")
int uage) {
System.out.println("提交上来的用户名是:" + uname + ",年龄是:" + (uage + 100) + ".");
return "main";
}
}
5)手工提取数据
class java {
/**
* 姓名:<input name="name"><br>
* 年龄:<input name="age"><br>
*/
@RequestMapping("/five")
public String five(HttpServletRequest request) {
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
System.out.println("提交上来的用户名是:" + name + ",年龄是:" + (age + 100) + ".");
return "main";
}
}
中文乱码解决方案
使用过滤器进行中文编码配置
<!--web.xml-->
<web-app>
<!--中文编码过滤器配置在最前面(建议)-->
<filter>
<filter-name>utf8Filter</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>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>utf8Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
处理器方法的返回值
在controller层添加@ResponseBody注解,可以使接口响应结果到浏览器内
在pom.xml文件中添加jackson的依赖,因为SpringMVC框架自动进行json转换要使用的工具类
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
</dependencies>
在类或方法上添加注解@ResponseBody
@Controller
@RequestMapping("/ajax")
public class StudentAction {
@ResponseBody //声明是ajax请求
public List<Student> ajax() {
List<Student> list = new ArrayList<>();
Student stu1 = new Student("张三", 22);
Student stu2 = new Student("李四", 23);
Student stu3 = new Student("王五", 24);
list.add(stu1);
list.add(stu2);
list.add(stu3);
return list; //SpringMVC框架自动转换为json数组 [{"name":"张三","age":22},{"name":"李四","age":23},{"name":"王五","age":24}]
}
}
或
/*
@Controller
@ResponseBody
*/
@RestController //为@Controller @ResponseBody 的集合注解
@RequestMapping("/ajax")
public class StudentAction {
public List<Student> ajax() {
List<Student> list = new ArrayList<>();
Student stu1 = new Student("张三", 22);
Student stu2 = new Student("李四", 23);
Student stu3 = new Student("王五", 24);
list.add(stu1);
list.add(stu2);
list.add(stu3);
return list; //SpringMVC框架自动转换为json数组 [{"name":"张三","age":22},{"name":"李四","age":23},{"name":"王五","age":24}]
}
}
在springmvc.xml文件中添加注解驱动 ,它是与@ResponseBody注解配置使用
<!--springmvc.xml-->
<beans>
<!--因为解析ajax请求,必须添加注解驱动,不需要添加视图解析器-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>