第三周SpringMVC

什么是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));
    }

心得体会:感觉有很多是自己比较陌生的点,就比如类型转换器,然后之前自己对于文件上传这一部分从来没有成功过,每一次都上传失败,但是这次之后对文件上传清晰了很多

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值