大数据正式33
SpringMVC
- Servlet缺点
- 一个Servlet有8行配置文件
- 一个Servlet只能处理一个业务
- 一张表可能有4+n个Servlet,所以会有32+n行配置文件
- 获取属性只能得到字符串类型,需要自己转换类型
- 获取参数只能是request.getParameter()
- SpringMVC优点
- 不管工程中有多少servlet,只需要配置一个servlet分发器即可
- springmvc中使用controller替代一个controller
- 获取参数的类型支持自动装换,而且支持对象的自动封装
- SpringMvc有多种获取参数的方式
SprigMVC入门案例
- jar包
- 项目结构
- 整体流程
-
代码
-
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- servlet分发器 --> <servlet> <servlet-name>springmvc</servlet-name> <!-- 分发器 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 注入配置文件的地址:创建spring容器 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/applicationContext-mvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <!-- /或*.action --> <url-pattern>*.action</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
-
applicationContext-mvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd "> <!-- 扫描包 --> <context:component-scan base-package="com.peng"></context:component-scan> <!-- 扫描注解 --> <context:annotation-config></context:annotation-config> <bean name="/hello.action" class="com.peng.controller.HelloController"></bean> </beans>
-
com.peng.controller
-
HelloController
package com.peng.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("index.jsp"); modelAndView.addObject("msg", "hello"); return modelAndView; } }
-
-
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> <!-- <link rel="stylesheet" type="text/css" href="styles.css"> --> </head> <body> This is my JSP page. <br> <h1>${msg}</h1> </body> </html>
-
- 访问名称
- http://localhost/SpringMVC_inroom/hello.action(注:端口为80)
- 执行结果
注解形式的SpringmMVC
package com.peng.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello.action")
public String helloAction(Model model) {
model.addAttribute("msg", "hello,world!");
return "index";
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd ">
<!-- 扫描包 -->
<context:component-scan base-package="com.peng"></context:component-scan>
<!-- 扫描注解 -->
<context:annotation-config></context:annotation-config>
<!-- SpringMVC的注解开关 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 资源解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
添加前后缀的SpringMVC(applicationContext-mvc.xml)
<!-- 资源解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
解决乱码--过滤器(web.xml)
<!-- 乱码过滤器 -->
<filter>
<filter-name>characterFilter</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>characterFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
数据的获取
-
HttpServletRequest对象的getParameter方法
package com.peng.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/showAddUser.action") public String showAddUser() { return "addUser"; } @RequestMapping("/addUser.action") public String addUser(HttpServletRequest request, Model model) { String username = request.getParameter("username"); System.out.println(username); model.addAttribute("username", username); return "addUser"; } }
-
与表单的name值一样的参数String username
-
参数名来控制
package com.peng.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/showAddUser.action") public String showAddUser() { return "addUser"; } @RequestMapping("/addUser.action") public String addUser(String username, Model model) { System.out.println(username); model.addAttribute("username", username); return "addUser"; } }
-
-
bean对象 User
-
参数名来控制
package com.peng.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/showAddUser.action") public String showAddUser() { return "addUser"; } @RequestMapping("/addUser.action") public String addUser(User user, Model model) { System.out.println(user.username); model.addAttribute("username", user.username); return "addUser"; } }
-
-
对象中的对象
-
参数名来控制
- dog.name
-
gog.age
class Dog{ private String name; public void setName(String name){ this.name=name; } public String getName(){ return this.name; } }
class User{ private dog; public void setDog(Dog dog{ this.dog=dog; } public Dog getDog(){ return this.dog; } }
package com.peng.controller; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class UserController { @RequestMapping("/showAddUser.action") public String showAddUser() { return "addUser"; } @RequestMapping("/addUser.action") public String addUser(String username, Model model) { System.out.println(user.dog.name); model.addAttribute("username", user.dog.name); return "addUser"; } }
-
日期问题
- 格式问题
2017/12/25这个错误; 2017-12-25这个可以;
- 解决(Controller中)
@InitBinder public void InitBinder(ServletRequestDataBinder srdb) { srdb.registerCustomEditor(java.util.Date.class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd"), true)); }
参数的同名提交
- String
a,b,c
- 例子
@RequestMapping("/addUser.action") public String addUser( HttpServletRequest request, Model model, Date date, String like) { String username = request.getParameter("username"); System.out.println(username + date.toString() + like); model.addAttribute("username", username); return "addUser"; }
- String[]
{a,b,c}数组形式
- 例子
@RequestMapping("/addUser.action") public String addUser( HttpServletRequest request, Model model, Date date, String[] like) { String username = request.getParameter("username"); System.out.println(username + date.toString() + Arrays.toString(like)); model.addAttribute("username", username); return "addUser"; }
参数名称不一致的问题
- 问题呈现
- form表单提交过来的name和参数中的name值不相同时--因为要见名知义,稍微改动了参数的名称
- @RequestParam("hobby")String[] hobbies
- @RequestParam
- value--对应form中的name值
- defaultValue--默认的值
- require--必须传过来时有参数
- 例子
@RequestMapping("/addUser.action") public String addUser( HttpServletRequest request, Model model, Date date, @RequestParam(value = "like", defaultValue = "啥也不喜欢!") String[] likes) { String username = request.getParameter("username"); System.out.println(username + date.toString() + Arrays.toString(likes)); model.addAttribute("username", username); return "addUser"; }
文件上传
- 注意的坑
- form中的参数
- method:post
- enctype:multipart/form-data
- file文件标签
- 必须有name属性
- 文件解析器
- 必须有id属性
- id属性的值必须是:multipartResolver
- form中的参数
-
改三个地方
-
jsp中
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <!DOCTYPE HTML > <html> <head> <title>Add User</title> </head> <body bgcolor="#0000ff" text="#ffffff"> <form action="addUser.action" method="POST" enctype="multipart/form-data"> <table border="1"> <tr> <td>用户名:</td> <td><input type="text" name="username" /> </td> </tr> <tr> <td>时间:</td> <td><input type="date" name="date" /> </td> </tr> <tr> <td>上传文件:</td> <td><input type="file" name="file" /> </td> </tr> <tr> <td>爱好:</td> <td>篮球<input type="checkbox" name="like" value="basketball" /> 足球<input type="checkbox" name="like" value="football" /> 乒乓球<input type="checkbox" name="like" value="pingpangball" /> </tr> <tr> <td>提交:</td> <td><input type="submit" value="确认" /> </td> </tr> </table> </form> </body> </html>
-
解析器(必须有id和class)
<!-- 文件上传解析器 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="defaultEncoding" value="utf-8"></property> <property name="maxUploadSize" value="10485760000"></property> <property name="maxInMemorySize" value="40960"></property> </bean>
-
后台
package com.peng.controller; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import org.apache.commons.io.FileUtils; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @Controller public class UserController { @RequestMapping("/showAddUser.action") public String showAddUser() { return "addUser"; } @RequestMapping("/addUser.action") public String addUser(@RequestParam MultipartFile file) throws IOException { FileUtils.writeByteArrayToFile(new File( "C:\\Users\\Administrator.PC-20160710IJPJ\\Desktop\\haha.png"), file.getBytes()); System.out.println(file.toString()); return "addUser"; } @InitBinder public void InitBinder(ServletRequestDataBinder srdb) { srdb.registerCustomEditor(java.util.Date.class, new CustomDateEditor( new SimpleDateFormat("yyyy-MM-dd"), true)); } }
-
请求和重定向
- 默认是转发
- 重定向--不能直接写界面,尤其是WEB-INF下的界面
return "redirect:请求" return "redirect:addUser.action"