目录结构:
- SprinigMVC是什么
- SpringMVC工作原理
- @Controller和@RequestMapping注解
- @Controller注解类型
- @RequestMapping注解类型
- 基于注解的SpringMVC+MySQL
- 参考文章
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的例子。package com.example.controller;import org.springframework.stereotype.Controller;@Controllerpublic class ProductController {}为了保证DispatcherServlet能够扫描到该Controller,需要在DispatcherServlet中配置注解驱动和上下文扫描包。上下文扫描包:……xmlns:context=http://www.springframework.org/schema/context……注解驱动包:……xmlns:mvc=http://www.springframework.org/schema/mvc……然后应用<mvc:annotation-driven>和<context:component-scan/>元素:......
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package=""></context:component-scan>
......
@RequestMapping注解类型
该注解类型在控制器类的内部定义每一个动作相应的处理方法,一个采用@RequestMapping注释的方法将成为一个请求处理方法,并由调度程序在接收到对应的URL请求时调用,下面是一个RequestMapping注解方法的控制器类。@Controllerpublic class ProductController {@RequestMapping(value="/productInput")public String inputProduct(){//do something herereturn "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})public String test(){//do something herereturn "viewpage";}如果method属性只有一个HTTP方法值,则无需{},直接为method=RequestMethod.POST,如果未指定method属性,则请求处理方法可以处理任意HTTP方法。此外RequestMapping注释类型也可以用来注释一个控制器类。import org.springframework.stereotype.Controller;...@Controller@RequestMapping(value="/customer")public class CustomerController{@RequestMapping(value="/delete", method={RequestMethod.POST, RequestMethod.PUT})public String deleteCustomer(){//do something herereturn “viewpage”;}}在这种情况下,所有的方法都将映射为相对于类级别的请求,如例子中的deleteCustomer方法,由于控制器类映射使用"/customer",而deleteCustomer方法映射为"/delete",则需要通过 http://localhost:8081/SpringMVC/customer/delete 访问。
基于注解的SpringMVC+MySQL
项目目录结构:login.jsp类 1 <%@ page language="java" contentType="text/html; charset=utf-8" 2 pageEncoding="utf-8"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 7 <title>login</title> 8 </head> 9 <body>10 <form action="select.do" method="post">11 <input type="submit" value="查询所有信息"/>12 </form>13 </body>14 </html>login.jsp第二步:web.xml类 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> 3 <display-name>mydb2</display-name> 4 <welcome-file-list> 5 <welcome-file>welcome.html</welcome-file> 6 </welcome-file-list> 78 <!-- 这里是一个总控制器 --> 9 <servlet>10 <servlet-name>spring</servlet-name>11 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 12 </servlet>13 <servlet-mapping>14 <servlet-name>spring</servlet-name>15 <url-pattern>*.do</url-pattern>16 </servlet-mapping>17 18 <!-- 解决POST提交乱码问题 -->19 <filter>20 <filter-name>EncodingName</filter-name>21 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>22 <init-param>23 <param-name>encoding</param-name>24 <param-value>utf-8</param-value>25 </init-param>26 </filter>27 <filter-mapping>28 <filter-name>EncodingName</filter-name>29 <url-pattern>/*</url-pattern>30 </filter-mapping>31 32 </web-app>web.xmlspring-servlet.xml类 1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 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/beans http://www.springframework.org/schema/beans/spring-beans.xsd 8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> 9 10 11 <mvc:annotation-driven/>12 13 <context:component-scan base-package="com.spring"></context:component-scan>14 15 <!-- 获取properties配置文件 -->16 <bean id="config" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">17 <property name="locations">18 <list>19 <value>classpath:db-config.properties</value>20 </list>21 </property>22 </bean>2324 <!-- 获取数据源 -->25 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">26 <property name="driverClassName">27 <value>${db.dirverClass}</value>28 </property>29 <property name="url">30 <value>${db.url}</value>31 </property>32 <property name="username">33 <value>${db.username}</value>34 </property>35 <property name="password">36 <value>${db.password}</value>37 </property>38 </bean>39 40 <!-- 41 给jdbc模板注入数据源42在JdbcTemplate里有一个对应的私有属性dataSource43 -->44 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">45 <property name="dataSource" ref="dataSource"></property>46 </bean>47 48 <!-- 49给userDao(负责和数据库打交道)注入模板50 在com.spring.db.UserDao里应该设有一个JdbcTemplate jdbcTemplate的私有属性,并且setter51-->52 <bean id="userDao" class="com.spring.db.UserDao">53 <property name="jdbcTemplate" ref="jdbcTemplate"></property>54 </bean>55 56 <!--定义视图 通过internalResourceView来表示 使用的是Servlet/jsp技术-->57 <bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver">58 <property name="viewClass">59 <value>org.springframework.web.servlet.view.InternalResourceView</value>60 </property>61 <!--jsp存放的目录-->62 <property name="prefix">63 <value>/view/</value>64 </property>65 <!--jsp文件的后缀-->66 <property name="suffix">67 <value>.jsp</value>68 </property>69 </bean>70 </beans>spring-servlet.xmldb-config.properties类db.url=jdbc:mysql:///test?characterEncoding=utf8&useSSL=true&serverTimezone=GMTdb.username=rootdb.password=rootdb.dirverClass=com.mysql.cj.jdbc.Driverdb-config.properties这里的Driver和版本有关系,笔者的Connection/j 是6.0.5的。UserVO.java类 1 package com.spring.model; 23 public class UserVO { 4 private int id; 5 private String name; 6 private String pwd; 78 public int getId() { 9 return id;10 }11 public void setId(int id) {12 this.id = id;13 }14 public String getName() {15 return name;16 }17 public void setName(String name) {18 this.name = name;19 }20 public String getPwd() {21 return pwd;22 }23 public void setPwd(String pwd) {24 this.pwd = pwd;25 }26 }UserVO.javaUserDao.java类 1 package com.spring.db; 23 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.List; 67 import org.springframework.jdbc.core.JdbcTemplate; 8 import org.springframework.jdbc.core.RowMapper; 9 10 import com.spring.model.UserVO;11 12 public class UserDao {13 private JdbcTemplate jdbcTemplate;14 15 public JdbcTemplate getJdbcTemplate() {16 return jdbcTemplate;17 }18 19 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {20 this.jdbcTemplate = jdbcTemplate;21 }22 @SuppressWarnings({ "unchecked", "rawtypes" })23 public List<UserVO> find(){24 String sql="select * from userbo";//这里也可以添加查询限制条件25 return jdbcTemplate.query(sql, new RowMapper(){26 27 public Object mapRow(ResultSet rs, int num) throws SQLException {28 UserVO uservo=new UserVO();29 uservo.setId(rs.getInt("USERID"));30 uservo.setName(rs.getString("USERNAME"));31 uservo.setPwd(rs.getString("USERPSW"));32 return uservo;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 package com.spring.controller; 23 import java.util.HashMap; 4 import java.util.List; 5 import java.util.Map; 67 import org.springframework.beans.factory.annotation.Autowired; 8 import org.springframework.stereotype.Controller; 9 import org.springframework.web.bind.annotation.RequestMapping;10 import org.springframework.web.servlet.ModelAndView;11 import com.spring.db.UserDao;12 import com.spring.model.UserVO;13 14 @Controller15 public class LoginController {16 17 @Autowired18 private UserDao userDao;19 @SuppressWarnings("unchecked")20 21 @RequestMapping(value="/select.do")22 public ModelAndView selectAll(){23 24 @SuppressWarnings("rawtypes")25 Map model=new HashMap();26 27 List<UserVO> 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 void setUserDao(UserDao userDao) {this.userDao = userDao;}然后再在spring-servlet.xml里面添加如下bean信息:<bean id="controller" class="com.spring.controller.LoginController"><property name="userDao" ref="userDao"></property></bean>userInfo.jsp类 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 2 <%@page import="com.spring.model.UserVO"%> 3 <% 4 @SuppressWarnings("unchecked") 5 /* 6 *这儿是合法的,根据com.spring.db.controller.LoginController中handleRequest的返回数据类型进行设置的。 7 */ 8 List<UserVO> str= (List<UserVO>)request.getAttribute("uservo"); 9 %>10 11 <html>12 <head>13 <title>result</title>14 </head>15 16 <body>17 <table border="1">18 <tr>19 <td >编号</td>20 <td >姓名</td>21 <td >年龄</td>22 </tr>23<%24for(UserVO user:str){25%>26<tr>27<td><%=user.getId() %></td>28<td><%=user.getName() %></td>29<td><%=user.getPwd() %></td>30</tr>31<%32}33 %>34 </table>35 </body>36 </html>SpringMVC+MyBatis集成配置 http://www.linuxidc.com/Linux/2016-09/135212.htmSpringMVC总结篇 http://www.linuxidc.com/Linux/2016-06/132659.htmSpring+SpringMVC企业快速开发架构搭建 http://www.linuxidc.com/Linux/2015-09/122942.htmSpringMVC的乱码处理 http://www.linuxidc.com/Linux/2015-07/120542.htmSpring MVC+Spring3+Hibernate4开发环境搭建 http://www.linuxidc.com/Linux/2013-07/87119.htmSpring MVC整合Freemarker基于注解方式 http://www.linuxidc.com/Linux/2013-02/79660.htm基于注解的Spring MVC简单介绍 http://www.linuxidc.com/Linux/2012-02/54896.htmSpringMVC详细示例实战教程 http://www.linuxidc.com/Linux/2015-06/118461.htmSpringMVC错误页面配置 http://www.linuxidc.com/Linux/2016-12/138097.htmSpringMVC 异常处理 http://www.linuxidc.com/Linux/2015-06/119049.htmSpringMVC框架入门配置 IDEA下搭建Maven项目 http://www.linuxidc.com/Linux/2016-09/134918.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139438.htm