springMvc:是一個表現層框架,它是Spring框架的一部分.做用是從請求中接收傳入的參數,及將處理後的結果數據返回給頁面展現.html
架構流程前端
(處理器映射器就像一個map集合,key是用戶在瀏覽器url中輸入的地址,value是對應的方法對象.這時若是有攔截器則進行判斷,符合要求則放行,不然就進行攔截) java
如下組件一般使用框架提供實現:mysql
用戶請求到達前端控制器,它就至關於mvc模式中的c,dispatcherServlet是整個流程控制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在下降了組件之間的耦合性。程序員
HandlerMapping負責根據用戶請求找到Handler即處理器,springmvc提供了不一樣的映射器實現不一樣的映射方式,例如:配置文件方式,實現接口方式,註解方式等。web
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。spring
因爲Handler涉及到具體的用戶業務請求,因此通常狀況須要程序員根據業務需求開發Handler。sql
經過HandlerAdapter對處理器進行執行,這是適配器模式的應用,經過擴展適配器能夠對更多類型的處理器進行執行。數據庫
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果經過頁面展現給用戶。apache
springmvc框架提供了不少的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。咱們最經常使用的視圖就是jsp。
通常狀況下須要經過頁面標籤或頁面模版技術將模型數據經過頁面展現給用戶,須要由程序員根據業務需求開發具體的頁面。
說明:在springmvc的各個組件中,處理器映射器、處理器適配器、視圖解析器稱爲springmvc的三大組件。 須要用戶開發的組件有handler、view(即controller和jsp) |
新建工程à導入springMvc獨立運行的jar包à在web.xml中配置前端控制器à編寫springMvc核心配置文件,pojo,controller,jsp
Web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>SpringMvc0523</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
<!-- springMvc前端控制器 --> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 若是沒有制定springMvc核心配置文件,那麼默認會去找/WEB-INF/+<servlet-name>中的內容 + -servlet.xml配置文件 --> <!-- 指定核心配置文件位置 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springMvc.xml</param-value> </init-param>
<!-- tomcat啓動的時候就加載這個servlet --> <load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app> |
Tips: org.springframework.web.servlet.DispatcherServlet的位置以下:
springMvc.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- 配置@Controller註解掃描 --> <context:component-scan base-package="cn.itcast.controller"></context:component-scan>
<!-- 若是沒有顯示的配置處理器映射器和處理器適配那麼springMvc會去默認的dispatcherServlet.properties中查找, 對應的處理器映射器和處理器適配器去使用,這樣每一個請求都要掃描一次他的默認配置文件,效率很是低,會下降訪問速度,因此要顯示的配置處理器映射器和處理器適配器 -->
<!-- 註解形式的處理器映射器(已過期) --> <!--<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"></bean> --> <!-- 註解形式的處理器適配器(已過期) --> <!--<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"></bean> -->
<!-- 配置最新版的註解的處理器映射器 --> <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean> --> <!-- 配置最新版的註解的處理器適配器 --> <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean> -->
<!-- 註解驅動: 做用:替咱們自動配置最新版的註解的處理器映射器和處理器適配器 --> <mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置視圖解析器 做用:在controller中指定頁面路徑的時候就不用寫頁面的完整路徑名稱了,能夠直接寫頁面去掉擴展名的名稱 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 真正的頁面路徑 = 前綴 + 去掉後綴名的頁面名稱 + 後綴 --> <!-- 前綴 --> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 後綴 --> <property name="suffix" value=".jsp"></property> </bean>
</beans> |
Tips:
1.若是沒有顯示的配置處理器映射器和處理器適配那麼springMvc會去默認的dispatcherServlet.properties中查找
dispatcherServlet.properties:
2. org.springframework.web.servlet.view.InternalResourceViewResolver:
若是沒有配置視圖解析器,那麼在Controller中指定要返回的頁面的位置時,都要寫全網頁的路徑名稱,如:
modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
Items.java:
public class Items {
private Integer id; private String name; private Float price; private String pic; private Date createtime; private String detail;
get,set方法… } |
ItemsController:
@Controller public class ItemsController {
@RequestMapping("/list") public ModelAndView itemsList() throws Exception{
List<Items> itemList = new ArrayList<>(); //商品列表 Items items_1 = new Items(); items_1.setName("聯想筆記本_3"); items_1.setPrice(6000f); items_1.setDetail("ThinkPad T430 聯想筆記本電腦!");
Items items_2 = new Items(); items_2.setName("蘋果手機"); items_2.setPrice(5000f); items_2.setDetail("iphone6蘋果手機!");
itemList.add(items_1); itemList.add(items_2);
//模型和視圖 //model模型:模型對象中存放了要返回給頁面的數據 //view視圖:視圖對象中指定了要返回的頁面的位置 ModelAndView modelAndView = new ModelAndView();
//將要返回給頁面的數據放入模型和視圖對象中 modelAndView.addObject("itemList", itemList);
//指定要返回的頁面的位置 modelAndView.setViewName("itemList ");
return modelAndView; } } |
itemList.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>查詢商品列表</title> </head> <body> <form action="${pageContext.request.contextPath }/item/queryitem.action" method="post"> 查詢條件: <table width="100%" border=1> <tr> <td><input type="submit" value="查詢"/></td> </tr> </table> 商品列表: <table width="100%" border=1> <tr> <td>商品名稱</td> <td>商品價格</td> <td>生產日期</td> <td>商品描述</td> <td>操做</td> </tr> <c:forEach items="${itemList }" var="item"> <tr> <td>${item.name }</td> <td>${item.price }</td> <td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td> <td>${item.detail }</td>
<td><a href="${pageContext.request.contextPath }/itemEdit.action?id=${item.id}">修改</a></td>
</tr> </c:forEach>
</table> </form> </body> </html> |
步驟:
1)Dao層
pojo和映射文件以及接口使用逆向工程生成
SqlMapConfig.xml mybatis核心配置文件
ApplicationContext-dao.xml 整合後spring在dao層的配置
數據源
會話工廠
掃描Mapper
2)service層
事務 ApplicationContext-trans.xml
@Service註解掃描 ApplicationContext-service.xml
3)controller層
SpringMvc.xml
註解掃描:掃描@Controller註解
註解驅動:替咱們顯示的配置了最新版的處理器映射器和處理器適配器
視圖解析器:顯示的配置是爲了在controller中不用每一個方法都寫頁面的全路徑
4)web.xml
springMvc前端控制器配置
spring監聽
建立工程,導入jar包(主要是Mybatis和Spring整合的jar包,由於SpringMvc和Spring都是Spring公司出的,不須要整合),再按整合步驟慢慢來:
Dao層:
先創建數據庫(springmvc)和表:
再利用逆向工程生成pojo,映射文件以及接口:
StarServer:
public class StartServer {
public void generator() throws Exception{ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("generator.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(configFile); DefaultShellCallback callback = new DefaultShellCallback(overwrite); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); }
public static void main(String[] args) throws Exception { try { StartServer startServer = new StartServer(); startServer.generator(); } catch (Exception e) { e.printStackTrace(); } } } |
Generator.xml:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration> <context id="testTables" targetRuntime="MyBatis3"> <commentGenerator> <!-- 是否去除自動生成的註釋 true:是: false:否 --> <property name="suppressAllComments" value="true" /> </commentGenerator> <!--數據庫鏈接的信息:驅動類、鏈接地址、用戶名、密碼 --> <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/springmvc" userId="root" password="root"> </jdbcConnection> <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" userId="yycg" password="yycg"> </jdbcConnection> -->
<!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析爲 Integer,爲 true時把JDBC DECIMAL 和 NUMERIC 類型解析爲java.math.BigDecimal --> <javaTypeResolver> <property name="forceBigDecimals" value="false" /> </javaTypeResolver>
<!-- targetProject:生成PO類的位置 --> <javaModelGenerator targetPackage="cn.itheima.pojo" targetProject=".\src"> <!-- enableSubPackages:是否讓schema做爲包的後綴 --> <property name="enableSubPackages" value="false" /> <!-- 從數據庫返回的值被清理先後的空格 --> <property name="trimStrings" value="true" /> </javaModelGenerator> <!-- targetProject:mapper映射文件生成的位置 --> <sqlMapGenerator targetPackage="cn.itheima.dao" targetProject=".\src"> <!-- enableSubPackages:是否讓schema做爲包的後綴 --> <property name="enableSubPackages" value="false" /> </sqlMapGenerator> <!-- targetPackage:mapper接口生成的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.itheima.dao" targetProject=".\src"> <!-- enableSubPackages:是否讓schema做爲包的後綴 --> <property name="enableSubPackages" value="false" /> </javaClientGenerator> <!-- 指定數據庫表 --> <!-- <table tableName="items"></table> --> <table tableName="items"></table> <!-- <table tableName="orderdetail"></table> --> <table tableName="user"></table> <!-- <table schema="" tableName="sys_user"></table> <table schema="" tableName="sys_role"></table> <table schema="" tableName="sys_permission"></table> <table schema="" tableName="sys_user_role"></table> <table schema="" tableName="sys_role_permission"></table> -->
<!-- 有些表的字段須要指定java類型 <table schema="" tableName=""> <columnOverride column="" javaType="" /> </table> --> </context> </generatorConfiguration> |
運行StarServer後:
將生成的這些文件複製到項目中.
Mybatis核心配置文件 SqlMapConfig.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
</configuration> |
ApplicationContext-dao.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 加載配置文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 數據庫鏈接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="5" /> </bean>
<!-- mapper配置 --> <!-- 讓spring管理sqlsessionfactory 使用mybatis和spring整合包中的 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 數據庫鏈接池 --> <property name="dataSource" ref="dataSource" /> <!-- 加載mybatis的全局配置文件 --> <property name="configLocation" value="classpath:SqlMapConfig.xml" /> </bean>
<!-- 配置Mapper掃描器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.itheima.dao"/> </bean> </beans> |
Service層:
事務ApplicationContext-trans.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 數據源 --> <property name="dataSource" ref="dataSource" /> </bean>
<!-- 通知 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 傳播行爲 --> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice>
<!-- 切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* cn.itheima.service.*.*(..))" /> </aop:config>
</beans> |
@Service註解掃描ApplicationContext-service.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:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- @Service掃描 --> <context:component-scan base-package="cn.itheima.service"></context:component-scan> </beans> |
controller層:
SpringMvc.xml:
註解掃描:掃描@Controller註解
註解驅動:替咱們顯示地配置了最新版的處理器映射器和處理器適配器
視圖解析器:顯示的配置是爲了在controller中不用每一個方法都寫頁面的全路徑
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- @Controller註解掃描 --> <context:component-scan base-package="cn.itheima.controller"></context:component-scan>
<!-- 註解驅動: 替咱們顯示的配置了最新版的註解的處理器映射器和處理器適配器 --> <mvc:annotation-driven></mvc:annotation-driven>
<!-- 配置視圖解析器 做用:在controller中指定頁面路徑的時候就不用寫頁面的完整路徑名稱了,能夠直接寫頁面去掉擴展名的名稱 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 真正的頁面路徑 = 前綴 + 去掉後綴名的頁面名稱 + 後綴 --> <!-- 前綴 --> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 後綴 --> <property name="suffix" value=".jsp"></property> </bean> </beans> |
web.xml:
springMvc前端控制器配置
spring監聽
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>ssm0523</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list>
<!-- 加載spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:ApplicationContext-*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
<!-- SpringMvc前端控制器 --> <servlet> <servlet-name>springMvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>ContextConfigLocation</param-name> <param-value>classpath:SpringMvc.xml</param-value> </init-param> <!-- 啓動tomcat時就加載這個servlet --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springMvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app> |
新建controller,service接口及其實現類,將頁面複製過來:
itemsController:
@Controller public class itemsController {
@Autowired private ItemsService itemService;
@RequestMapping("/list") public ModelAndView itemsList() throws Exception{
List<Items> itemList = itemService.list();
ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("itemList", itemList); modelAndView.setViewName("itemList");
return modelAndView; } } |
Tips: @Autowired和@Resource: @Autowired爲自動裝配,因此若是該接口只有一個實現類,用哪一個註解均可以,但若是該接口有多個實現類,那隻能用@Resource.
ItemsServiceImpl:
@Service public class ItemsServiceImpl implements ItemsService{
@Autowired private ItemsMapper itemsMapper;
public List<Items> list() { //若是不須要任何查詢條件,直接將example對象new出來便可 ItemsExample example = new ItemsExample(); List<Items> list = itemsMapper.selectByExampleWithBLOBs(example ); return list; } } |
Tips:
不用selectByExample(example)方法,是由於items中的detail是大文本類型,若用了該方法,則查詢不出該字段.
需求:在商品列表頁面點擊"修改"按鈕時,頁面跳轉到修改頁面(將要修改的商品信息展現出來).
itemsController:
@Controller public class itemsController {
@Autowired private ItemsService itemService;
@RequestMapping("/list") public ModelAndView itemsList() throws Exception{…}
/** *springMvc中默認支持的參數類型:也就是說在controller方法中能夠加入這些也能夠不加, 加不加看本身需不須要,都行. *HttpServletRequest *HttpServletResponse *HttpSession *Model */ @RequestMapping("itemEdit") public String itemEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) throws Exception{
String idStr = request.getParameter("id");
Items items = itemService.findItemsById(Integer.parseInt(idStr));
//Model模型:模型中放入了返回給頁面的數據 //model底層其實就是用的request域來傳遞數據,可是對request域進行了擴展. model.addAttribute("item",items);
//若是springMvc方法返回一個簡單的string字符串,那麼springMvc就會認爲這個字符串就是頁面的名稱 return "editItem"; } } |
Tips:由於用getParameter方法從頁面接收過來的數據都會變成String類型,而id是Integer類型的,因此要進行轉換.
ItemsServiceImpl:
@Service public class ItemsServiceImpl implements ItemsService{
@Autowired private ItemsMapper itemsMapper;
@Override public List<Items> list() {…}
@Override public Items findItemsById(Integer id) { Items items = itemsMapper.selectByPrimaryKey(id); return items; } } |
需求:修改指定的商品信息.
itemsController:
@Controller public class itemsController {
@Autowired private ItemsService itemService;
@RequestMapping("/list") public ModelAndView itemsList() throws Exception{…}
/** *springMvc中默認支持的參數類型:也就是說在controller方法中能夠加入這些也能夠不加, 加不加看本身需不須要,都行. *HttpServletRequest *HttpServletResponse *HttpSession *Model */ @RequestMapping("itemEdit") public String itemEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) throws Exception{…}
//springMvc能夠直接接收基本數據類型,包括string.spirngMvc能夠幫你自動進行類型轉換. //controller方法接收的參數的變量名稱必需要等於頁面上input框的name屬性值 @RequestMapping("updateitem") public String update(Integer id, String name, Float price, String detail) throws Exception{
Items items = new Items(); items.setId(id); items.setName(name); items.setPrice(price); items.setDetail(detail); items.setCreatetime(new Date());
itemService.update(items);
return"success"; } } |
Tips:參數列表中的參數都是從頁面傳過來的,雖然修改頁面的日期被註釋掉了,但仍要給他new個日期,由於該字段在數據庫中被設置爲非空.
補充(瞭解便可):
通常controller方法接收的參數的變量名稱必需要等於頁面上input框的name屬性值,但若是加了@RequestParam("input框的name屬性值")的話,參數名稱就隨便寫了:
ItemsServiceImpl:
@Service public class ItemsServiceImpl implements ItemsService{
@Autowired private ItemsMapper itemsMapper;
@Override public List<Items> list() {…}
@Override public Items findItemsById(Integer id) {…}
@Override public void update(Items items) { itemsMapper.updateByPrimaryKeyWithBLOBs(items); } } |
Tips:用updateByPrimaryKeyWithBLOBs(items)是由於用反向工程生成的ItemsMapper.xml中相似的其餘方法不能查詢到Items中的detail屬性(大文本格式),而該方法能夠:
在瀏覽器url中輸入的地址及後面帶參數的,都是get請求,表單提交,修改和保存的都是post請求.在此,是post請求,會出現亂碼問題,所以要解決post請求亂碼的問題:
在web.xml中加入如下代碼:
<!-- 配置Post請求亂碼 --> <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> |
解決get請求亂碼的問題有如下兩種方法:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
②對參數進行從新編碼:
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默認編碼,須要將tomcat編碼後的內容按utf-8編碼
ItemsController:
@Controller public class itemsController {
@Autowired private ItemsService itemService;
//springMvc能夠直接接收基本數據類型,包括string.spirngMvc能夠幫你自動進行類型轉換. //controller方法接收的參數的變量名稱必需要等於頁面上input框的name屬性值 //spirngMvc能夠直接接收pojo類型:要求頁面上input框的name屬性名稱必須等於pojo的屬性名稱 @RequestMapping("updateitem") public String update(Items items) throws Exception{
items.setCreatetime(new Date());
itemService.update(items);
return"success"; } } |
Tips: spirngMvc能夠直接接收pojo類型:要求頁面上input框的name屬性名稱必須等於pojo的屬性名稱!!!
應用場景:好比須要進行高級查詢時,既要經過商品信息進行查詢,也還可能要用用戶信息和其餘信息進行查詢,這時用pojo類接收是不夠的,應該用vo(封裝類)接收.
新建一個vo包:
QueryVo:
package cn.itheima.vo;
import cn.itheima.pojo.Items;
public class QueryVo {
//商品對象 private Items items;
//用戶對象... //訂單對象...
public Items getItems() { return items; } public void setItems(Items items) { this.items = items; } } |
ItemsController:
@Controller public class itemsController {
@Autowired private ItemsService itemService;
@RequestMapping("/list") public ModelAndView itemsList() throws Exception{…}
/** *springMvc中默認支持的參數類型:也就是說在controller方法中能夠加入這些也能夠不加, 加不加看本身需不須要,都行. *HttpServletRequest *HttpServletResponse *HttpSession *Model */ @RequestMapping("itemEdit") public String itemEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model) throws Exception{…}
//springMvc能夠直接接收基本數據類型,包括string.spirngMvc能夠幫你自動進行類型轉換. //controller方法接收的參數的變量名稱必需要等於頁面上input框的name屬性值 //spirngMvc能夠直接接收pojo類型:要求頁面上input框的name屬性名稱必須等於pojo的屬性名稱 @RequestMapping("updateitem") public String update(Items items) throws Exception{…}
//若是Controller中接收的是Vo,那麼頁面上input框的name屬性值要等於vo的屬性.屬性.屬性..... @RequestMapping("/search") public String search(QueryVo vo) throws Exception{
System.out.println(vo); return ""; } } |
ItemList頁面中:
查詢條件: <table width="100%" border=1> <tr> <!-- 若是Controller中接收的是Vo,那麼頁面上input框的name屬性值要等於vo的屬性.屬性.屬性..... --> <td>商品名稱:<input type="text" name="items.name"/></td> <td>商品價格:<input type="text" name="items.price"/></td> <td><input type="submit" value="查詢"/></td> </tr> </table> |
打斷點測試,是有值的:
createTime爲Date類型,且此字段在數據庫中被設置爲非空.若將Controller中update()裏對createTime的處理註釋掉, 放開修改頁面中對createTime修改語句的註釋,此時啓動服務器,在修改頁面對createTime進行修改,則會報錯.緣由是createTime是Date類型,頁面傳過來的是String類型,而Controller中沒有將String轉換爲Date,因此會報錯:
這時候咱們須要自定義轉換器:
新建個轉換器包,在包下新建一個自定義的全局的String到Date的轉換器類:
CustomGlobalStrToDateConverter:
import org.springframework.core.convert.converter.Converter; /** * String:源 * Date:目標 * @author Tan * */ public class CustomGlobalStrToDateConverter implements Converter<String, Date> {
@Override public Date convert(String source) {
try {
Date date = new SimpleDateFormat("yy-MM-DD hh:mm:ss").parse(source); return date;
} catch (ParseException e) { e.printStackTrace(); } return null; } } |
Tips:不熟悉SimpleDateFormat()相關方法的話,自行查閱JDK文檔.
寫完自定義轉換器類後,要在SpringMvc.xml中進行配置:
SpringMvc.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!-- @Controller註解掃描 --> <context:component-scan base-package="cn.itheima.controller"></context:component-scan>
<!-- 註解驅動: 替咱們顯示的配置了最新版的註解的處理器映射器和處理器適配器 --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置視圖解析器 做用:在controller中指定頁面路徑的時候就不用寫頁面的完整路徑名稱了,能夠直接寫頁面去掉擴展名的名稱 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 真正的頁面路徑 = 前綴 + 去掉後綴名的頁面名稱 + 後綴 --> <!-- 前綴 --> <property name="prefix" value="/WEB-INF/jsp/"></property> <!-- 後綴 --> <property name="suffix" value=".jsp"></property> </bean> <!-- 配置自定義轉換器 注意: 必定要將自定義的轉換器配置到註解驅動上 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <!-- 指定自定義轉換器的全路徑名稱 --> <bean class="cn.itheima.controller.converter.CustomGlobalStrToDateConverter"/> </set> </property> </bean> </beans> |
從接收數據和向頁面傳遞數據兩個方面進行簡單說明:
接收數據:
Struts2用模型/屬性驅動接收數據,model/屬性都是全局變量,全局變量中存放着數據,Action中的任何方法均可以用,所以線程不安全,所以Action纔要作成多例的;
而SpringMvc用局部變量接收數據,線程安全,所以Controller是單例的.(不必開多例,浪費資源).
向頁面傳遞數據:
Struts2經過值棧向頁面傳遞數據;
而SpringMvc經過model向頁面傳遞數據,model底層採用的是request域.
較爲官方的解釋:
1. springMvc:是一個表現層框架,
做用:就是從請求中接收傳入的參數,
將處理後的結果數據返回給頁面展現
2. ssm整合:
1)Dao層
pojo和映射文件以及接口使用逆向工程生成
SqlMapConfig.xml mybatis核心配置文件
ApplicationContext-dao.xml 整合後spring在dao層的配置
數據源
會話工廠
掃描Mapper
2)service層
事務 ApplicationContext-trans.xml
@Service註解掃描 ApplicationContext-service.xml
3)controller層
SpringMvc.xml
註解掃描:掃描@Controller註解
註解驅動:替咱們顯示的配置了最新版的處理器映射器和處理器適配器
視圖解析器:顯示的配置是爲了在controller中不用每一個方法都寫頁面的全路徑
4)web.xml
springMvc前端控制器配置
spring監聽
3.參數綁定(從請求中接收參數)重點
1)默認類型:
在controller方法中能夠有也能夠沒有,看本身需求隨意添加.
httpservletRqeust,httpServletResponse,httpSession,Model(ModelMap其實就是Mode的一個子類,通常用的很少)
2)基本類型:string,double,float,integer,long.boolean
3)pojo類型:頁面上input框的name屬性值必需要等於pojo的屬性名稱
4)vo類型:頁面上input框的name屬性值必需要等於vo中的屬性.屬性.屬性....
5)自定義轉換器converter:
做用:因爲springMvc沒法將string自動轉換成date因此須要本身手動編寫類型轉換器
須要編寫一個類實現Converter接口
在springMvc.xml中配置自定義轉換器
在springMvc.xml中將自定義轉換器配置到註解驅動上
最終目錄結構: