上次介绍了一下ssh框架, 这次就简单的介绍一下MVC框架。
Spring MVC 介绍
Spring的一部分
Spring springmvc 无缝衔接
SpringMVC 是一个web层框架。 用来接收参数,和响应请求
快速搭建:
需是web项目,还要web.xml去配置一个springmvc核心接收参数的类,springMVC用的是servlet开发的
1. 创建 web maven项目
2. 导包
Spring 所有包 + spring-web springmvc包
3. 写配置文件
(springMVC.xml) 位置随便放
开启注解
an base-package="com.hd.controller"></context:component-scan>
4. 写类
@Controller
public class HelloController {
@RequestMapping("/hello")
public void hello(){
System.out.println("hello springmvc");
}
}
5. 在web.xml里面输入springmvc核心类
<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>
<!--
/* 拦截所有 包括静态资源
/ 目录匹配
*.action 后缀名匹配
-->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
6. 测试打开网页,输入地址
如果使用的是maven项目,导包的方式要改为war包,默认的是jar包,改成war包配置tomcat就会选用xxx.war
打开网页可能会有404错误,在控制台打印了代码,说明我们写的方法已经执行了
ModelAndView
调用他的setViewName 方法可以实现页面的转发
@RequestMapping("/hello")
public ModelAndView hello(){
System.out.println("hello controller");
ModelAndView mav = new ModelAndView();
mav.setViewName("/index.jsp");
return mav;
}
Springmvc框架的结构:
1. 请求到达web.xml,配置了前台控制器(DispatcherServlet)
url-partten *.action
2.前端控制器就是一个老板,老板拿到了需求,指派handlerMapping解析请求,和配置文件中的拦截器,并且处理的结果返回给老板
3.老板这个时候去找handler执行器,执行结果
HandlerAdapter 去执行对应的方法
这个方法可以是modelAndView 将数据和要跳转的页面都封装到modelView这个类中,将modelAndView返回给老板
Void
Json字符串
4. 老板接收到modelAndView,对这个modelAndView进行解析,指派给viewResolver来解析式图,获得view
5.老板在拿到view交给视图渲染器去渲染,渲染成html返回给老板,老板将最终成品交给客户
这个框架的结构流程:需要程序员做的就只有 配置前端控制器然后书写handler(controller)
SpringMVC 绑定参数
1. 获得原生态的servlet对象
Request
Response
Session
ServletContext
private ModelAndView servletNative(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
想要获得原生态对象,只需要把这个对象放在controller的防问方法中,就能直接获得对应的对象
2.普通类型的参数绑定
String +8大基本数据类型Integer
@RequestMapping("/normalParam")
public void normalParam(String name,Integer id){
System.out.println(name);
}
只要把参数的名字写在函数的参数中,就可以直接进行绑定
8大基础类型最好采用他们封装类,好处是不传也不会报异常,比如如果是用int id那么访问时没有传id的参数,就会报异常,改为integer就不报
3. Pojo类型参数的封装
public void pojoParam(User user,String name){
System.out.println(user);
System.out.println(name);
}
直接把pojo对象放入参数,自动将参数封装到实体类中,并且如果还有其他的基本类型,也会将参数放入基本类型中
4. 直接对pojo的封装类绑定
public void queryVoParam(QueryVo vo){
System.out.println(vo);
}
要求在传参的时候必须要使用ognl表达式的方式传参
比如user.name user.id 这样才能把参数封装到vo的属性中
5. 数组参数
public void arrayParam(Integer[] ids){
for (Integer id:ids){
System.out.println(id);
}
}
要求地址为 ids = 1&ids=2
6. 集合参数
public void listParam(QueryVo vo){
System.out.println(vo);
}
集合参数只能使用封装类
传参的时候 list=1&list=2&list=3…方式传参
List[0]=1&list[1]=2
请求的限制
1. 地址的限制
value = {"/listParam",“/asdf”}
2. 请求方法的限制
如果不写method就默认两种都有
@RequestMapping(value = {"/listParam"},method = RequestMethod.POST)
可以限制get/post
3.请求的方法不仅有post和get
* 中国人 post/get
* 添加 post
* 修改 post
* 删除会采用 post/get
* 查找 get
* 外国人 post delete put get
增 删 改 查
* ResultFul 风格
Controller 返回值
4种
1. ModelAndView
既可以控制页面的跳转,也可以实现数据的封装
2. Void
想使用servlet原生态的开发方式
3. String
才是官方推荐的
可以控制页面的跳转
@RequestMapping("/strDemo")
public String strDemo(Model model){
model.addAttribute("name","list");
return "redirect:/index.jsp";
}
数据的封装需借助model,在方法中写上参数model,调用model的addAttribute的方法实现数据封装
页面跳转的方式:默认是转发
重定向:”redirect:/index.jsp”
转发:”forward:/index.jsp”
4. Json
对比json技术的优劣(fast json jackson json)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.4</version>
</dependency>
在springmvc开启 转换方法
可以省略里面转换器,加上<mvc:annotation-driven> 自动转换成json格式
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
</mvc:message-converters>
</mvc:annotation-driven>
ssm框架整合
spring跟mybatis整合
spring 跟 springmvc
导包
Mybatis log4j
实际上就是把 spring和mybatis放到web里面中
Web.xml 要配置项目启动就读取spring 配置文件
拦截器
自定义的拦截器
相当于原来的过滤器的作用,在访问目标controller之前,先访问过滤器
自定义一个类去实现三个方法
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("方法调用前执行");
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
//执行controller之后调用
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
//页面渲染之后调用
}
再把自定义的拦截器,配置到springmvc核心配置文件中
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/sys/*"/>
<bean class="com.hd.interceptor.MyInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
Springmvc 实现文件上传
Springmvc提供的方式
Spring提供的方式(推荐)
导包: 文件上传 需要依赖
Commons-io
Commons-fileupload
书写前端页面
Form表单提交
请求方式:post
Enctype:必须要是multipart
将上述代码,添加到controller方法中
//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
request.getSession().getServletContext());
//检查form中是否有enctype="multipart/form-data"
if (multipartResolver.isMultipart(request)) {
//将request变成多部分request
MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
//获取multiRequest 中所有的文件名
Iterator iter = multiRequest.getFileNames();
while (iter.hasNext()) {
//一次遍历所有文件
MultipartFile file = multiRequest.getFile(iter.next().toString());
if (file != null) {
//获取文件的后缀名
String expresion = "";
int i = file.getOriginalFilename().lastIndexOf(".");
if (i != -1) {
expresion = file.getOriginalFilename().substring(i + 1);
}
//拼接生成新的文件的名字使用随机数
String path = UUID.randomUUID().toString() + "." + expresion;
//上传并保存到服务器的对应地址下
file.transferTo(new File(request.getServletContext().getRealPath("/upload/" + path)));
System.out.println(path);
map.put("path", path);
}
}
}
异常处理器:
写个类 实现handlerExceptionResovler接口
并实现这个接口的方法
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @Nullable Object o, Exception e) {
ModelAndView mav = new ModelAndView();
mav.addObject("error","未知错误");
mav.setViewName("/error.jsp");
return mav;
}
需要在springmvc.xml文件中配置这个类
<bean class="com.hd.exception.MyExceptionHandler"></bean>
类型转换器:
日期类型
yyyy-MM-dd HH:mm:ss类型
mvc的父子工程:
根据传统分层:
一个父工程起到聚合的作用,将所有的子工程聚合到一起,子工程相对独立开发
4个子项目(web(controller) service dao entity)
根据业务模块分层
父子工程的创建:
建立一个maven项目,将该项目作为父工程
需要更改父工程的打包方式
为该工程建立子工程
右击父工程: new一个module
更改子工程的打包方式,默认继承父工程
一个父工程可以建立多个子工程
子工程是完全独立的,如果自工程之间需要依赖关系,直接在子工程的pom.xml文件中加入其他工程的依赖即可
整个项目的技术架构依赖放在父工程中
粗减的话语,希望大家看了不要嫌弃,有什么错,望留言更正!!