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项目
-
1.2 导入SpringMVC所需的jar包
-
1.3 配置Web.xml文件
-
1.4 新建一个Demo类
-
1.5 配置springmvc.xml文件
-
1.6 将项目添加到tomcat中,并运行
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传递过来的数据
-
2.3 在浏览器中访问
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";
}
-
在浏览器中访问
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";
}
在浏览器中访问
5、访问静态资源
-
5.1 在WebContent下新建一个resources文件夹,用来存放静态资源(js,css,image等)
-
再新建一个名为staticResources.jsp文件
-
-
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 在浏览器中访问
6、前端(jsp)参数传递到后端(Controller)
-
6.1 在WebContent下新建一个addUser.jsp文件
-
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 运行结果
-
解决中文乱码问题
-
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" />
- 乱码问题解决
-
-
6.4 通过实体类获取数据
-
6.4.1 在类路径下添加一个包,新建一个User实体类,并生成get()和set()方法
-
6.4.2 在Controller中做如下修改
/** * 添加用户 * @param username * @param age */ @PostMapping("/addUser") public void addUser(User user) { System.out.println("用户名:" + user.getUsername() + " , 年龄:" + user.getAge()); }
访问结果
-
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页面
-
7.3 访问结果
注:
SpringMVC返回json格式的数据所需的jar包 :(版本自己任意,建议选新版本)
- jackson-core-2.10.2.jar
- jackson-annotations-2.10.2.jar
- 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 准备工作 :
-
添加一个 commons-fileupload-1.3.jar 包(版本自选)
-
在 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 运行项目访问
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 运行项目访问
在MultipartFile接口中定义了如下很多有用的方法,例如:
- getSize()方法获得文件长度,以此决定允许上传的文件大小。
- isEmpty()方法判断上传文件是否为空文件,以此决定是否拒绝空文件。
- getInputStream()方法将文件读取为java.io.InputStream流对象。
- getContentType()方法获得文件类型,以此决定允许上传的文件类型。
- 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 运行项目访问
持续更新中......