什么是MVC:M数据模型 V视图 C控制器 实现数据模型与视图层的分离
SpringMVC:是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架。
SpringMVC的工作流程:
客户端(浏览器)发送HTTP请求->DispatcherServlet拦截到该请求根据请求信息->调用HandlerMapping->解析到对应的Controller;DispatcherServlet调用Controller控制器,开始由Controller处理->调用相应Service层处理不同的业务->调用DAO层进行数据处理;DAO层和数据库交互,进行相应的增、删、改、查等;
Controller处理器处理完->返回一个ModelAndView对象至DispatcherServlet
DispatcherServlet调用视图解析器ViewResolver处理视图映射,并返回至DispatcherServlet将处理后的结果传给View视图渲染;
View将渲染后的视图返回给客户端(浏览器),显示在相应的页面上。
使用maven搭建web项目
1、创建maven项目
2、main文件夹下新建文件夹webapps
3、选择File下Project Structure
4、选择Facets点击+点击web
5、选择项目中的对应模块
6、修改Deployment Descriptors下web.xml路径
7、修改Web Resource Directory路径
XML方式
导入SpringMVC的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.8</version>
</dependency>
</dependencies>
1、建jsp页面
2、创建controller(控制器)(记得添加注解@Contriller)
3、在resources文件夹下创建SpringMVC核心文件spring-mvc.xml,并添加注解扫描
<context:component-scan base-package="com.cqgcxy.controller"/>
4、web.xml中配置SpringMVC核心控制器DispathcerServlet
<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:spring-mvc.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>
配置tomcat
1、点击Run下Edit Configurations
2、点击+下的Tomcat Server点击Local
3、选择本地tomcat所在的地址【tomcat的bin目录上一层路径】,点击Fix
4、选择Artifacts--->Web Application:Exploded--->From Modules
5、选择项目中的对应模块,选择OK--->继续选择OK
注解方式
1、添加servlet依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
2、在config包下创建配置类SpringMvcConfig替换spring-mvc.xml
@Configuration
@ComponentScan("com.cqgcxy.controller")
public class SpringMvcConfig {
}
3、在config包下创建配置类ServletContainersInitConfig替换web.xml
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
@Override
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
SpringMVC多种类型数据响应
1、配置视图解析器
xml方式:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
注解方式
//在spring配置类中加入视图解析器的配置
@Bean
public InternalResourceViewResolver internalResourceViewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
controller
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
System.out.println("hello···");
return "hello";
}
}
2、返回字符串
直接返回字符串:字符串与视图解析器的前后缀拼接后跳转
返回带有前缀的字符串:转发:forward:/WEB-INF/views/hello.jsp
重定向:redirect:/index.jsp
@RequestMapping("/forward")
public String forword(){
System.out.println("forward···");
return "forward:/WEB-INF/views/index.jsp";
}
@RequestMapping("/redirect")
public String redirect(){
System.out.println("redirect···");
return "redirect:/login.jsp";
}
3、返回ModelAndView对象
编写JSP页面
编写Controller
@RequestMapping("/hello2")
public ModelAndView hello2(){
//Model:模型,用于封装数据
//View:视图,用于展示数据
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("username","pep7chiao");
modelAndView.setViewName("hello");
return modelAndView;
}
3、回写数据
直接返回字符串
@RequestMapping("/data1")
public void data1(HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("叽里呱啦");
}
@RequestMapping(value = "/data2",produces = "text/html;charset=utf-8")
@ResponseBody
public String data2(){
return "啊啊啊";
}
返回对象或者集合
1、导入json依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
mvc的注解驱动
<mvc:annotation-driven/>
spring配置类一定要加@EnableWebMvc
创建实体类
编写控制器中处理请求的方法
@RequestMapping("/data3")
@ResponseBody
public Phone data3() {
Phone phone = new Phone();
phone.setPhoneId(1L);
phone.setBrandId(1L);
phone.setModelNumber("mate60");
phone.setCapacity(256);
return phone;
}
获取不同类型参数
获取基本类型参数:
@Controller
@RequestMapping("/phone")
public class PhoneController {
@RequestMapping("/param1")
@ResponseBody
public void param1(int phoneId,String modelNumber){
System.out.println(phoneId);
System.out.println(modelNumber);
}
}
其中括号里面写自己需要请求的参数 但是如果参数名称与Controller的业务方法参数名称不一致时,需要用到@RequestParam @RequestParam("mNumber")
获取POJO类型参数
实体方法名称Phone要在Controller中一致
http://localhost:8888/phone/param4?phoneId=1&modelNumber=mate60
public class Phone {
private Long phoneId;
private String modelNumber;
//······
}
@RequestMapping("/param4")
@ResponseBody
public void param4(Phone phone){
System.out.println(phone.getPhoneId());
System.out.println(phone.getModelNumber());
}
获取数组类型参数
Controller的数组名称与请求参数name一致
获取集合类型参数
要封装到DTO
public class PhoneStoreDTO {
private String storeName;
private List<Phone> phoneList;
//······
}
表单的编写
<form action="${pageContext.request.contextPath}/phone/param7" method="post">
<p>
店名:<input type="text" name="storeName">
</p>
<p>
手机编号1:<input type="text" name="phoneList[0].phoneId">
</p>
<p>
手机型号1:<input type="text" name="phoneList[0].modelNumber">
</p>
<p>
手机编号2:<input type="text" name="phoneList[1].phoneId">
</p>
<p>
手机型号2:<input type="text" name="phoneList[1].modelNumber">
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
@RequestMapping(value = "/param7",method = RequestMethod.POST)
@ResponseBody
public void param7(PhoneStoreDTO phoneStoreDTO){
System.out.println(phoneStoreDTO);
}
自定义类型转换器
//定义转换器类实现Converter接口
public class DateConverter implements Converter<String, Date> {
public Date convert(String dateStr) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = null;
try {
date = format.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
//在springmvc配置类中配置自定义类型转换器
@Bean
public WebMvcConfigurer webMvcConfigurer(){
return new WebMvcConfigurer() {
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new DateConverter());
}
};
}
@RequestMapping("/param10/{date}")
@ResponseBody
public void param10(@PathVariable("date") Date date){
System.out.println(date);
}
//接收时间类型参数
//http://localhost:8888/phone/param14?dateTime=2022-08-08 08:08:08
@RequestMapping("/param14")
@ResponseBody
public void param14(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime dateTime){
System.out.println(dateTime);
}
实现文件上传
导入文件上传的相关依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
配置文件上传解析器
@Bean
public MultipartResolver multipartResolver(){
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
commonsMultipartResolver.setMaxUploadSize(5242880);
commonsMultipartResolver.setMaxUploadSizePerFile(5242880);
commonsMultipartResolver.setDefaultEncoding("UTF-8");
return commonsMultipartResolver;
}
编写文件上传代码
@RequestMapping("/upload")
@ResponseBody
public void upload(MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
System.out.println("文件名称:"+originalFilename);
file.transferTo(new File("D:\\upload\\"+originalFilename));
}
心得体会:感觉有很多是自己比较陌生的点,就比如类型转换器,然后之前自己对于文件上传这一部分从来没有成功过,每一次都上传失败,但是这次之后对文件上传清晰了很多