目录结构:
contents structure [-]
SpringMVC是什么
MVC的全称是Model View Controller,通过实现MVC框架可以很好的数据、视图、业务逻辑进行分离。Spring MVC也是一种MVC框架,它是SpringFrameWork的后续产品,同样需要Spring的Jar包才能运行起来。
SpringMVC工作原理
SpringMVC是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的就是DispatcherServlet,DispathcerServlet负责将每一个request转发到相应的Controller,Controller处理后再返回模型(Model)和视图(View)。在使用注解的SpringMVC中,处理器Controller是基于@Controller和@RequestMapping进行注解的。
@Controller和@RequestMapping注解
@Controller注解类型
声明一个控制器类,DispatcherServlet会通过扫描机制找到该类,如下是一个@Controller的例子。
packagecom.example.controller;importorg.springframework.stereotype.Controller;
@Controllerpublic classProductController {
}
为了保证DispatcherServlet能够扫描到该Controller,需要在DispatcherServlet中配置注解驱动和上下文扫描包。
上下文扫描包:
……
xmlns:context=http://www.springframework.org/schema/context
……
注解驱动包:
……
xmlns:mvc=http://www.springframework.org/schema/mvc
……
然后应用和元素:
......
......
@RequestMapping注解类型
该注解类型在控制器类的内部定义每一个动作相应的处理方法,一个采用@RequestMapping注释的方法将成为一个请求处理方法,并由调度程序在接收到对应的URL请求时调用,下面是一个RequestMapping注解方法的控制器类。
@Controllerpublic classProductController {
@RequestMapping(value="/productInput")publicString inputProduct(){//do something here
return "ProductForm";
}
}
使用requestMapping注解的value属性将URL映射到方法,在上面的例子中通过 http://localhost:8080/SpringMVC/productInput访问inputProduct方法。RquestMapping除了有value属性外,还有许多属性,比如method、consumes、header、path等等。例如当HTPP POST或PUT方法时才调用test()方法。
@RequestMapping(value="/order_process", method={RequestMethod.POST, RequestMethod.PUT})publicString test(){//do something here
return "viewpage";
}
如果method属性只有一个HTTP方法值,则无需{},直接为method=RequestMethod.POST,如果未指定method属性,则请求处理方法可以处理任意HTTP方法。此外RequestMapping注释类型也可以用来注释一个控制器类。
importorg.springframework.stereotype.Controller;
...
@Controller
@RequestMapping(value="/customer")public classCustomerController{
@RequestMapping(value="/delete", method={RequestMethod.POST, RequestMethod.PUT})publicString deleteCustomer(){//do something here
return“viewpage”;
}
}
在这种情况下,所有的方法都将映射为相对于类级别的请求,如例子中的deleteCustomer方法,由于控制器类映射使用"/customer",而deleteCustomer方法映射为"/delete",则需要通过 http://localhost:8081/SpringMVC/customer/delete 访问。
基于注解的SpringMVC+MySQL
项目目录结构:
login.jsp类
1
2 pageEncoding="utf-8"%>
3
4
5
6
7
login8
9
10
11
12
13
14
login.jsp
第二步:
web.xml类
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 mydb2
4
5 welcome.html
6
7
8
9
10 spring
11 org.springframework.web.servlet.DispatcherServlet
12
13
14 spring
15 *.do
16
17
18
19
20 EncodingName
21 org.springframework.web.filter.CharacterEncodingFilter
22
23 encoding
24 utf-8
25
26
27
28 EncodingName
29 /*30 31
32
web.xml
spring-servlet.xml类
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:mvc="http://www.springframework.org/schema/mvc"
5 xmlns:context="http://www.springframework.org/schema/context"
6 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
7 http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd
8 http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd">
9
10
11
12
13
14
15
16
17
18
19 classpath:db-config.properties
20
21
22
23
24
25
26
27 ${db.dirverClass}
28
29
30 ${db.url}
31
32
33 ${db.username}
34
35
36 ${db.password}
37
38
39
40
44
45
46
47
48
52
53
54
55
56
57
58
59 org.springframework.web.servlet.view.InternalResourceView
60
61
62
63 /view/
64
65
66
67 .jsp
68
69
70
spring-servlet.xml
db-config.properties类
db.url=jdbc:mysql:///test?characterEncoding=utf8&useSSL=true&serverTimezone=GMT
db.username=root
db.password=root
db.dirverClass=com.mysql.cj.jdbc.Driver
db-config.properties
这里的Driver和版本有关系,笔者的Connection/j 是6.0.5的。
UserVO.java类
1 packagecom.spring.model;2
3 public classUserVO {4 private intid;5 privateString name;6 privateString pwd;7
8 public intgetId() {9 returnid;10 }11 public void setId(intid) {12 this.id =id;13 }14 publicString getName() {15 returnname;16 }17 public voidsetName(String name) {18 this.name =name;19 }20 publicString getPwd() {21 returnpwd;22 }23 public voidsetPwd(String pwd) {24 this.pwd =pwd;25 }26 }
UserVO.java
UserDao.java类
1 packagecom.spring.db;2
3 importjava.sql.ResultSet;4 importjava.sql.SQLException;5 importjava.util.List;6
7 importorg.springframework.jdbc.core.JdbcTemplate;8 importorg.springframework.jdbc.core.RowMapper;9
10 importcom.spring.model.UserVO;11
12 public classUserDao {13 privateJdbcTemplate jdbcTemplate;14
15 publicJdbcTemplate getJdbcTemplate() {16 returnjdbcTemplate;17 }18
19 public voidsetJdbcTemplate(JdbcTemplate jdbcTemplate) {20 this.jdbcTemplate =jdbcTemplate;21 }22 @SuppressWarnings({ "unchecked", "rawtypes"})23 public Listfind(){24 String sql="select * from userbo";//这里也可以添加查询限制条件
25 return jdbcTemplate.query(sql, newRowMapper(){26
27 public Object mapRow(ResultSet rs, int num) throwsSQLException {28 UserVO uservo=newUserVO();29 uservo.setId(rs.getInt("USERID"));30 uservo.setName(rs.getString("USERNAME"));31 uservo.setPwd(rs.getString("USERPSW"));32 returnuservo;33 }34 });35 }36 }
UserDao.java
这儿的jdbcTemplate不能用注解@Autowired来指定,因为在spring-servlet.xml文件中已经指定了扫描包为"com.spring",而jdbcTemplate的包为“org.springframework.jdbc.core.JdbcTemplate”,所以会扫描不到JdbcTemplate的。在spring-servlet.xml已经通过bean的方式,将数据源注入JDBC模板。
LoginController.java类
1 packagecom.spring.controller;2
3 importjava.util.HashMap;4 importjava.util.List;5 importjava.util.Map;6
7 importorg.springframework.beans.factory.annotation.Autowired;8 importorg.springframework.stereotype.Controller;9 importorg.springframework.web.bind.annotation.RequestMapping;10 importorg.springframework.web.servlet.ModelAndView;11 importcom.spring.db.UserDao;12 importcom.spring.model.UserVO;13
14 @Controller15 public classLoginController {16
17 @Autowired18 privateUserDao userDao;19 @SuppressWarnings("unchecked")20
21 @RequestMapping(value="/select.do")22 publicModelAndView selectAll(){23
24 @SuppressWarnings("rawtypes")25 Map model=newHashMap();26
27 List userVO=userDao.find();28
29 model.put("uservo", userVO);30
31 return new ModelAndView("userInfo",model);32 }33 }
LoginController.java
@Autowired根据字面意思可以很快理解,就是自动配置。有@Autowired注解的变量,会按照扫描路径进行查找文件并且自动配置信息。如果把userDao的注解@Autowired注解注释掉,也可以通过bean来实现相同的效果,首先在LoginController类里把userDao进行setter,如:
public voidsetUserDao(UserDao userDao) {this.userDao =userDao;
}
然后再在spring-servlet.xml里面添加如下bean信息:
userInfo.jsp类
1
2
3
4 @SuppressWarnings("unchecked")5 /*
6 *这儿是合法的,根据com.spring.db.controller.LoginController中handleRequest的返回数据类型进行设置的。7 */
8 List str= (List)request.getAttribute("uservo");9 %>
10
11
12
13
result14
15
16
17
18
19
编号20
姓名21
年龄22
23
24 for(UserVO user:str){25 %>
26
27
28
29
30
31
32 }33 %>
34
35
36
userInfo.jsp
参考文章