SpringMVC
为了快速启动,加一个键值对:
archetypeCatalog internal
一:基本概念了解:
是基于组件的;
(1)表现层:
1表现层:现层:SpringMVC 浏览器—>请求参数–>表现层—>响应请求–>浏览器业务层:
2spring框架
3持久层:Mybatis
(2)MVC设计模型:
M模块:java Bean
V:view:jsp
C:Contraller;控制器
(3)SpringMVC和Struts的优劣分析:
共同点:
- 底层都离不开原始的ServletAPI
- 都是基于mVC的表现层框架;
区别:
- 入口核心是Servlet; ------是Filter
- 基于方法设计的;--------是基于类的,每次创建一个动作类
- SPringMVC支持JSR303,处理ajax的请求更方便;
二入门程序:
release:
1pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!--根据个人需要自己修改-->
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.itcast</groupId>
<artifactId>springmvc_day01_01_quickstart</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>springmvc_day01_01_quickstart Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<!--jak运行编译器的版本 --!>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.0.2.RElEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.16.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>springmvc_day01_01_quickstart</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<!--根据个人需要自己修改-->
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</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>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</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>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--中文乱码过滤器-->
<filter>
<filter-name>ChracterEncondingFilter</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>ChracterEncondingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
3配置文件:springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans 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
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--开启注解的方式-->
<context:component-scan base-package="cn.itcast"></context:component-scan>
<!--视图的解析器对象-->
<bean id="internalResourceViewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!--开启springmvc框架注解的支持-->
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
4逻辑
请求------前端控制器--------》处理器映射器----->
|
|
响应---- -->前端控制器 ----------->视图适配器–>视图解析器
三注解:
@RequestMapping:
- 作用:用于建立请求URL和处理请求方法之间的对应关系;
- 属性:
- value和path一样,都是路径名字
- method:get/psot: @RequestMapping(path = “/test”,method = {RequestMethod.GET})用于指定请求的方式;
- params:规定参数;
- headers:用于规定发送的请求头
四:请求参数的绑定:
变量用& 参数用?分割
1三种参数类型:
- 基本类型
- javaBean
- 封装的集合;
五定义自定义类型转换器
- 大多数都处理好了,例如String转integer.等;
- 实现Converter接口:
package cn.itcast.utils;
import org.springframework.core.convert.converter.Converter;
import javax.xml.crypto.Data;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringToDateConverter implements Converter<String , Date> {
@Override
public Date convert(String source) {
Date parse = null;
if(source==null){
throw new RuntimeException("请你传入参数;");
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
parse = df.parse(source);
} catch (ParseException e) {
throw new RuntimeException("类型装换失败");
}
return parse;
}
}
springMVC.xml
<!--配置自定义类型转换器-->
<bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.utils.StringToDateConverter"></bean>
</set>
</property>
</bean>
<!--开启springmvc框架注解的支持-->
<mvc:annotation-driven ></mvc:annotation-driven >
<!--conversion-service ="conversionService"这一句是为了搭配自定类型转换器的,需要写到mvc里面,但是写了就会启动失败-->
</beans>
六常用注解:
-
@ RequestParam
- 提交的参数名,和去映射的方法的形参名不一样的时候;可以给形参前面加注解;
- 属性值name=“提交的参数名”;
-
@RequestBody
- get没有
- 用于获取请求头的内容;直接得到是键值对结构的数据;
- 给方法的形参前加注解;表示这个形参就代表的请求体内容,输入这个形参就行
- 异步请求 用的多
-
@PathVaribale
-
基于RESTful风格;
-
@RequestMapping("/testServlet/{sid}") public String testServlet(@PathVariable(name = "sid") String id){ System.out.println(id); return "success"; }
-
4 @HiddentHttpMenthodFillter过滤器
切换get—post之间切换
5:@RequestHeader
映射的方法(控制器方法)的形参.: 输出请求头
6:@CookieValue
value = “jSESSIONID”
得到cookie的值;
7**@ModuleAttribute**
- 有返回值的方法:可以放在方法上;使得不少控制器方法先执行;同一类的另一个有这个注解的方法先执行;
- 常用于表单提交的时候,三个内容,一个内容不写,扔使用数据库原来的值,此时可以继续使用哪个值的方法执行(怎么继续,可以让他去数据库查询);
- 无返回值的方法;
- 需要提供一个map的集合;然后让控制器方法从map中去,(1)此时需要这个注解要修饰这个方法的形参,(2)并且还要写到无返回值的这个方法的上面;
8@SessionAtrribute;
-
作用:用于共享变量之间;在Seession
-
@Controller @RequestMapping("/param") @SessionAttributes(value = {"msg"}) public class ParamController {
对于在request域中的,可以通过HttpServlet获取。也可以通过Model接口和她的实现类实现;
对于在Session域中这个注解;
${requestScope} ${sessionScope}
-
SpringMVC第二天
一响应结果和视图:
返回值类型
1void默认返回值;
2 jquery +jsonAjax的异步传送的;
导入jar包和jquery的js;
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.13.0-rc1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.0-rc1</version>
</dependency>
<dependency>
<!--jackson的一些jar包-->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.13.0-rc1</version>
</dependency>
二:MVC实现文件上传
(1):第三方组件Com实现文件上传;两个jar包: commons-io 和commons-fileupload
2:相对于平常,取消 了解析(判断为空,设置文件夹,)
<form action="/user/hello" method="post" enctype="multipart/form-data">
选择:<input type="file" name="upload"> </br>
<input type="submit" value="上传">
</form>
3:配置文件解析器xml:解析器的名字id是规定的,不能随意写;
<!--文件上传的解析器对象-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--10MB的大小-->
<property name="maxUploadSize" value="103535353510241024"></property>
4
@RequestMapping(path = "/hello")
public String sayHello(HttpServletRequest request ,MultipartFile upload ) throws IOException {
System.out.println("Hello StringMVC");
//DiskFileItemFactory f = new Disk
//上传文件;
//位置
String path = request.getSession().getServletContext().getRealPath("/updaloads/");
File file = new File(path);
//判断是否有
if(!file.exists()){
file.mkdirs();
}
//改上传的文件的名字
String originalFilename = upload.getOriginalFilename();
//随机名字+
String uuid = UUID.randomUUID().toString().replace("-","");
originalFilename= uuid+"-" +originalFilename;
//SpringMVC的传送文件的方法
upload.transferTo(new File(path,originalFilename));
return "success";
}
维克多,艾米丽,斯皮尔伯格导演的—幸福的终点站
(2)文件上传跨服务器的方式: 客服端—>应用服务器—存储到---->图片服务器
1:两个jar包:jsery的两个;
三: 异常处理技术:
自定义的异常类:
package cn.itcast.utils;
public class SysException extends Exception{
private String message;
public SysException(String message, String message1) {
super(message);
this.message = message1;
}
public SysException(String s) {
this.message =s;
}
@Override
public String getMessage() {
return message;
}
@Override
public String toString() {
return "SysException{" +
"message='" + message + '\'' +
'}';
}
public void setMessage(String message) {
this.message = message;
}
}
异常处理器
package cn.itcast.utils;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.midi.SysexMessage;
/*
* 异常处理器
* */
public class SysExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(
HttpServletRequest httpServletRequest, HttpServletResponse
httpServletResponse, Object o,
Exception e) {
SysException ee= null;
if (e instanceof SysException ){
ee = (SysException)e;
}else {
ee = new SysException("维护");
}
ModelAndView mv = new ModelAndView();
mv.addObject( "errorMsg",e.getMessage());
mv.setViewName("error");
return mv;
}
}
配置异常处理器:
<!--配置异常处理器-->
<bean id="sys" class="cn.itcast.utils.SysExceptionResolver"></bean>
四拦截器的作用 :
类似过滤器;但是拦截器是SpringMVC特有的,只有MVC才有;(放行)