SpringMVC基础入门学习

本文是一篇详细的SpringMVC入门教程,涵盖了从创建动态Web项目到实现文件上传的全过程。内容包括配置Web.xml和springmvc.xml,创建Controller,处理GET/POST请求,传递数据到HTML页面,解析请求路径参数,访问静态资源,处理表单提交,文件上传等。同时,还介绍了如何解决中文乱码问题以及通过实体类和JSON进行数据交互。
摘要由CSDN通过智能技术生成

SpringMVC基础入门学习

学习工具:JDK1.8 https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

SpringTools(STS) https://spring.io/tools

tomcat8.5 https://tomcat.apache.org/

1、SpringMVC的第一个项目

  • 1.1 新建一个动态的Web项目

    image-20200229200252758.png

  • 1.2 导入SpringMVC所需的jar包

    image-20200229200357058.png

  • 1.3 配置Web.xml文件

    image-20200229200455385.png

  • 1.4 新建一个Demo类

    image-20200229200500561.png

  • 1.5 配置springmvc.xml文件

    image-20200229200604672.png

  • 1.6 将项目添加到tomcat中,并运行

    image-20200229200631805.png

2、给html界面传递数据

  • 2.1 分别用Model和Map来传递数据

    @GetMapping("/hello")
    public String helloWorld(Model model, Map<String,Object> map) {
    	map.put("message", "map--->hello");
    	model.addAttribute("result", "model--->hello");
    	return "welcome";
    }
    
  • 2.2 在jsp页面拿到Controller传递过来的数据

    image-20200229200719940.png

  • 2.3 在浏览器中访问

    image-20200229201324657.png

3、调用一个Controller中不同的方法

	@GetMapping("/add")
	public String add(Model model) {
		model.addAttribute("result", "调用的是add方法");	
		return "action";
	}

	@GetMapping("/update")
	public String update(Model model) {
		model.addAttribute("result", "调用的是update方法");
		return "action";
	}
  • 在浏览器中访问

    image-20200229203209617.png

    image-20200229203222321.png

4、获取请求路径中的值

	@GetMapping("/user/{id}/{name}")
	public String urlValue(@PathVariable("id") Integer id, @PathVariable("name") String name, Model model) {
		model.addAttribute("message", "id: " + id + ", name: " + name);
		return "action";
	}

在浏览器中访问
image-20200229203453987.png

5、访问静态资源

  • 5.1 在WebContent下新建一个resources文件夹,用来存放静态资源(js,css,image等)

    image.png

    • 再新建一个名为staticResources.jsp文件

      image.png


  • 5.2 新建一个Controller类

    @Controller
    public class FindStaticController {
    	
    	@GetMapping("/static")
    	public String findStaticResourse() {
    		return "staticResources";
    	}
    
    }
    
  • 5.3 在springmvc.xml中添加如下配置:

    <!-- 解决静态资源访问:该注解会让 springmvc: 接收一个请求,并且该请求没有对应的 @requestMapping 时 ,将该请求交给服务器默认的 servlet(也就是tomcat)去处理(直接访问)-->
    <mvc:default-servlet-handler />
    
  • 5.4 在浏览器中访问

    image.png

image.png

6、前端(jsp)参数传递到后端(Controller)

  • 6.1 在WebContent下新建一个addUser.jsp文件

    image.png

  • 6.2 新建一个DataController类

    @Controller
    @RequestMapping("/user")
    public class DataController {
    	
    	/**
    	 *	跳转到添加用户页面
    	 * @return
    	 */
    	@GetMapping("/toUser")
    	public String toUserPage() {
    		return "addUser";
    	}
    	
    	/**
    	 * 添加用户
    	 * @param username
    	 * @param age
    	 */
    	@PostMapping("/addUser")
    	public void addUser(@RequestParam("username") String username, 
    							@RequestParam("age") Integer age) {
    		
    		System.out.println("用户名:" + username + " , 年龄:" + age);
    	}
    
    }
    

    @RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)

    语法:@RequestParam(value=””, required=”true/false”, defaultValue=””)

    value:参数名

    required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报错

    defaultValue:默认参数值,如果设置了该值,required=true将失效,自动为false,如果没有传该参数,就使用默认值

  • 6.3 运行结果

    image.png

    • 解决中文乱码问题

    • 1、在web.xml中添加如下配置

      <!-- 解决中文乱码问题 -->
      	<filter>
      		<filter-name>CharacterEncodingFilter</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>CharacterEncodingFilter</filter-name>
      		<url-pattern>/*</url-pattern>
      	</filter-mapping>
      
    • 2、在 tomcat的 conf目录下的 server.xml中添加如下配置

      在63行左右加上URIEncoding="UTF-8"
      <Connector port="8989" protocol="HTTP/1.1" connectionTimeout="20000"
      redirectPort="8443" URIEncoding="UTF-8" />
      

      • 乱码问题解决

      image.png


  • 6.4 通过实体类获取数据

    • 6.4.1 在类路径下添加一个包,新建一个User实体类,并生成get()和set()方法

      image.png

    • 6.4.2 在Controller中做如下修改

      /**
      * 添加用户
      * @param username
      * @param age
      */
      @PostMapping("/addUser")
      public void addUser(User user) {
      
      System.out.println("用户名:" + user.getUsername()
      					+ " , 年龄:" + user.getAge());
      }
      

      访问结果

      image.png


7、json传递数据(关于什么是AJAX?

  • 7.1 新建一个JsonController类

    @Controller
    @RequestMapping("/json")
    public class JsonController {
    	
    	@GetMapping("/toUser")
    	public String toUserPage() {
    		return "json";
    	}
    
    	@PostMapping("/addUser")
    	public void addUser(User user) {
    		System.out.println("年龄:" + user.getUsername() 
                               + " , 姓名:" + user.getAge());
    	}
    }
    
  • 7.2 在WebContent下添加json.jsp页面

    image.png

  • 7.3 访问结果
    image.png
    image.png

    SpringMVC返回json格式的数据所需的jar包 :(版本自己任意,建议选新版本)

    1. jackson-core-2.10.2.jar
    2. jackson-annotations-2.10.2.jar
    3. jackson-databind-2.10.2.jar

    再在 springmvc.xml中添加如下配置 :

    <!-- 此配置是 springmvc 的基础配置,很多功能都需要通过该注解来协调。
    	如JSR303校验,快捷ajax请求等...映射动态请求-->
    <mvc:annotation-driven/>
    

  • 7.4 获取Controller中的json数据
    • 点击这里,第4节目录,返回 Map与 List相似,对象也一样,这里不做详细介绍了。注意接收的变量名称即可。


8、文件上传

8.1 通过流的方式
  • 8.1.1 准备工作 :

    1. 添加一个 commons-fileupload-1.3.jar 包(版本自选)

    2. 在 springmvc.xml中添加如下配置

      <!--
      	配置 CommonsMultipartResolver,用于实现文件上传 ,
      	将其加入 springIOC 容器 springIOC 容器在初始化时,
      	会自动寻找一个 id="multipartResolver" 的 bean 并将其加到 IOC 容器
      -->
      <bean id="multipartResolver" class=
        "org.springframework.web.multipart.commons.CommonsMultipartResolver">
      	<property name="defaultEncoding" value="UTF-8"></property>
      	<!-- 上传单个文件的最大值,单位是 byte。这里设置为5M -->
      	<property name="maxUploadSize" value="5242880"></property>
      	<property name="maxInMemorySize" value="4096" />
      </bean>
      
  • 8.1.2 新建一个 upload.jsp 文件,并在body标签中填写一个from表单

    <body>
        <h2>文件上传:</h2>
    	<form action="upload" method="post" enctype="multipart/form-data">
    		请选择文件:<input type="file" name="files" />
    		<input type="submit" value="提 交" />
    	</form>
    </body>
    
  • 8.1.3 新建一个 UploadController类

    @Controller
    public class UploadController {
    	/**
    	* 通过流的方式上传文件 
    	* @param file
    	* @return
       */
    	@PostMapping("/upload")
    	public String upload(@RequestParam("files") MultipartFile file) {
    		
    		if (!file.isEmpty()) {
    			try {
    				// 获取文件的输入流
    				InputStream input = file.getInputStream();
    				// file.getOriginalFilename()获取到原始的文件名称
    				OutputStream out = new FileOutputStream("F:/" + 												file.getOriginalFilename()); 
    				
    				byte[] bytes = new byte[1024];
    				int len = -1;
    				while((len = input.read(bytes)) != -1) {
    					out.write(bytes, 0, len);
    				}
    				out.close();
    				input.close();
    				
    			} catch (FileNotFoundException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			} catch (Exception e) {
    				// TODO: handle exception
    				e.printStackTrace();
    			}
    		}
    		return "success";
    	}
    }
    
  • 8.1.4 运行项目访问

    image.png

    image.png

8.2 使用 transferTo() 方法
  • 8.2.1 在UploadController中重新写一个upload方法

    /**
    * 通过 transferTo()方法来上传文件
    * @return
    */
    @PostMapping("/upload2")
    public String upload2(@RequestParam("files")CommonsMultipartFile file) {
    		
    	File multFile = new File("F:/" + file.getOriginalFilename());
    		
    	try {
    		file.transferTo(multFile);
    			
    	} catch (IllegalStateException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
    		
    	return "success";
    }
    
  • 8.2.2 运行项目访问

    image.png

    image.png

    在MultipartFile接口中定义了如下很多有用的方法,例如:

    1. getSize()方法获得文件长度,以此决定允许上传的文件大小。
    2. isEmpty()方法判断上传文件是否为空文件,以此决定是否拒绝空文件。
    3. getInputStream()方法将文件读取为java.io.InputStream流对象。
    4. getContentType()方法获得文件类型,以此决定允许上传的文件类型。
    5. transferTo(dest)方法将上传文件写到服务器上指定的文件。

8.3 用 spring提供的上传文件的方法【推荐使用这种方法,效率比前两种更高】
  • 8.3.1 在UploadController中重新写一个upload方法

    /**
    *用 spring提供的上传文件的方法
    * @param request
    * @return
    */
    @PostMapping("/upload3")
    public String upload3(HttpServletRequest request) {
    		
    	// 将当前上下文初始化给 CommonsMultipartResolver(多部分解析器)
    	CommonsMultipartResolver multipartResolver = 
    		new CommonsMultipartResolver(request.getSession().getServletContext());
    		
    	// 检查 form表单中是否有 enctype="multipart/form-data"
    	if (multipartResolver.isMultipart(request)) {
    		// 将 request变成多部分 request
    		MultipartHttpServletRequest multRequest 
                = (MultipartHttpServletRequest) request;
    		
    		// 获取 multRequest中所有的文件名
    		Iterator<String> iter = multRequest.getFileNames();
    			
    		while (iter.hasNext()) {
    			// 一次遍历所有文件
    			MultipartFile file = multRequest.getFile(iter.next().toString());
    			if (file != null) {
    				try {
    					file.transferTo(new File("F:/" + file.getOriginalFilename()));
    						
    				} catch (IllegalStateException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				} catch (IOException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    		}
    	}
    	return "success";
    }
    
  • 8.3.2 运行项目访问

    image.png
    image.png

      持续更新中......
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值