3:SpringMVC使用
:
1.创建web项目,导入对应jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- junit测试包 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<scope>test</scope>
</dependency>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring web集成 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- mybatis核心包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis/spring包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>
<!-- 导入java ee jar 包 -->
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>8.0</version>
<scope>provided</scope>
</dependency>
<!-- 导入Mysql数据库链接jar包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!-- 导入dbcp的jar包,用来在applicationContext.xml中配置数据库 -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- JSTL标签类 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- 映入JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.4</version>
</dependency>
<!-- 上传组件包 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.17</version>
</dependency>
<!-- aop 反向代理 https://mvnrepository.com/artifact/com.sun.jersey/jersey-bundle -->
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-bundle</artifactId>
<version>1.19.3</version>
</dependency>
<!-- 封装了各种网络协议的客户端,支持FTP、NNTP、SMTP、POP3、Telnet等协议 -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.3</version>
</dependency>
2. 添加配置文件
1)web.xml
<!‐‐ springmvc配置文件 DispatcherServlet 核心控制器 ‐‐>
<servlet>
<servlet‐name>springDispatcherServlet</servlet‐name>
<servlet‐class>org.springframework.web.servlet.DispatcherServlet</servle t‐class>
<!‐‐ 初始化加载参数 ‐‐>
<init‐param>
<!‐‐ 初始化加载springmvc配置文件 ‐‐>
<param‐name>contextConfigLocation</param‐name>
<!‐ classpath什么时候需要加 和spring框架有关系的配置文件 都添加classpath: ‐‐>
<param‐value>classpath:springmvc.xml</param‐value>
</init‐param>
<!‐‐ 项目启动的时候就加载该配置文件 ‐‐>
<load‐on‐startup>1</load‐on‐startup>
</servlet>
<servlet‐mapping>
<servlet‐name>springDispatcherServlet</servlet‐name>
<!‐‐ springmvc会拦截所有以 .do结尾的请求 如果我们引入了静态文件,需要改为/ ‐‐>
<url‐pattern>*.do</url‐pattern>
</servlet‐mapping>
2) 配置添加 springmvc.xml
<!‐‐ 扫描当前包下的注解 ‐‐>
<context:component‐scan base‐package="com.by.controller"></context:component‐scan>
<!‐‐ 注解驱动:自动加载最新版的处理器映射器和处理器适配器 ‐‐>
<mvc:annotation‐driven></mvc:annotation‐driven>
3. Controller 层方法
规范:包名:controller 类名:XxxController
@Controller
@RequestMapping("userController")
public class UserController {
@ResponseBody
@RequestMapping("test")
public String test() {
System.out.println("userController test方法被访问");
return "success";
}
}
4.访问路径中传递参数
使用@PathVariable 注解获取路径中的参数,在test1方法的()将@PathVariable 添加在参数上,就会把路径中的参数赋值给()中的参数
@ResponseBody
@RequestMapping(value="testGet/{id}",method=RequestMethod.GET)
public String test1(@PathVariable("id")Integer id) {
System.out.println("userController testGet方法被访问"+id);
return "success";
}
5.如何跳转页面
路径:
相对路径 return “test.jsp”;
绝对路径 return “/test.jsp”;
页面存放的位置:
web项目的jsp文件存储:在web项目中WEB-INF下的目录是受保护的意思,它下边的jsp页面不能直接访问。
自定义文件夹,存放jsp
创建 /WEB‐INF/view/user 目录
把user相关的jsp内容添加在该目录中
案例:跳转到增加页面
@RequestMapping("toAddUserPage")
public String toAddUserPage() {
return "/WEB‐INF/view/user/addUser.jsp";
}
6.当我们添加上视图解析器后可简化代码
视图解析器作用:自动给后面controller 的方法return的字符串加上前缀和后缀,变成一个可用的url地址
springmvc.xml新增配置:
<!‐‐ 配置视图解析器 ‐‐>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!‐‐ 前缀 ‐‐>
<property name="prefix" value="/WEB‐INF/view/" />
<!‐‐ 后缀 ‐‐>
<property name="suffix" value=".jsp" />
</bean>
此时controller层增加方法跳转
@RequestMapping("toAddUserPage")
public String toAddUserPage() {
return "user/addUser";
}
7.使用ModelAndView对象跳转页面
案例: 跳转到修改页面 使用ModelAndView对象来跳转jsp页面
@RequestMapping("toUpdateUserPage")
public ModelAndView toUpdateUserPage() {
ModelAndView mv = new ModelAndView();
mv.setViewName("user/updateUser");
return mv;
}
8. 获取jsp页面传递的参数
1)增加方法获取参数,在参数中可以直接获取到 HttpServletRequest request
使用request.getParameter()可以获取到参数
@ResponseBody
@RequestMapping(value="addUser",method=RequestMethod.POST)
public void addUser(HttpServletRequest request) {
String userId = request.getParameter("userId");
String userName = request.getParameter("userName");
System.out.println(userId + " ‐‐‐ "+ userName);
}
2) 直接获取参数:addUser(Integer userId,String userName)
@ResponseBody
@RequestMapping(value="addUser",method=RequestMethod.POST)
public void addUser(Integer userId,String userName) {
System.out.println(userId + " ‐‐‐ "+ userName);
}
3) 直接添加对象:addUser(User user)
注意:from表单中的name值 必须要和实体类保持一致
@ResponseBody
@RequestMapping(value="addUser",method=RequestMethod.POST)
public void addUser(User user) {
System.out.println(user);
}
常见问题:
1)404: 路径有问题
2)405:get、post 传递有错误
3)400:时间格式异常
4)500:参数传递问题
9:如何从controller层向jsp页面传递参数
1)通过ModelMap 进行传递
案例:通过id查询数据-回显数据 将查询到的数据传递到update页面
@RequestMapping("selectUserById/{id}")
public String selectUserById(@PathVariable("id")Integer userId,ModelMap map) {
//去后台查询数据
//模拟数据
User user =new User(userId,"ZS");
//通过ModelMap将数据传递到前台页面
map.put("user", user);
return "user/updateUser";
}
2)通过Model 进行传递
@RequestMapping("selectUserById/{id}")
public String selectUserById(@PathVariable("id")Integer userId,Model model) {
//去后台查询数据
//模拟数据
User user =new User(userId,"ZS");
//通过ModelMap将数据传递到前台页面
model.addAttribute("user", user);
return "user/updateUser";
}
3)通过ModelAndView进行传递
@RequestMapping("selectUserById/{id}")
public ModelAndView selectUserById(@PathVariable("id")Integer userId) {
ModelAndView mv = new ModelAndView();
//去后台查询数据
//模拟数据
User user =new User(userId,"ZS");
//通过ModelMap将数据传递到前台页面
mv.addObject("user", user);
mv.setViewName("user/updateUser");
return mv;
}
10.日期类型
出现 400:数据类型出现问题
默认接受的是 yyyy/MM/dd
如果传递 yyyy‐MM‐dd,出现400
解决方案: 如果要传递 yyyy‐MM‐dd的解决办法:在实体类中规定一下
@DateTimeFormat(pattern="yyyy‐MM‐dd")
private Date userBir;
11.单独跳转页面方法
方法一在controller:
@RequestMapping("list2")
public String toList(){
return "meet2/list";
}
方法二 在springmvc配置文件添加配置
<mvc:view‐controller path="/list2" view‐name="meet2/list">
</mvc:view‐controller>