SpringMVC
Spring整合Mybatis
1、SqlSessionFactory对象应该放到spring容器中作为单例存在。
2、传统dao的开发方式中,应该从spring容器中获得sqlsession对象。
3、Mapper代理形式中,应该从spring容器中直接获得mapper的代理对象。
4、数据库的连接以及数据库连接池事务管理都交给spring容器来完成。
1、 用整合包 去配置 sqlSessionFactory 注入数据连接池 注入mybatis核心配置文件 别名扫描的包 ===》 这样搞定sqlSessionFactory
2、 后面的不管是传统的还是 动态代理的 都把sqlSessionFactory作为属性注入
SpringMVC是个mvc框架,属于SpringFrameWork的后续产品
处理用户请求的
关于Spring mvc 基于servlet 的 不是基于filter 的 控制器基于方法级别的拦截,处理器设计为单例。参数通过方法入参传递 与spring同一家公司,可以与spring无缝整合 不需要整合包
如果1000个并发 就一个到单例搞定了 内存消耗低 参数直接搞定到方法里面
Spring mvc 入门开发:
1 、创建动态web工程
2、 引入jar包 只有一个 spring-webmvc 的jar包
通过@Controller标识为控制器
方法接受请求 用注解 @RequestMapping绑定请求地址
作为web请求应该干一些活 比如响应视图, 响应视图可以用 ModelAndView 模型和视图 绑定数据 设置视图的名字
创建响应的jsp文件目录
package com.toov5.mvc.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class HelloController { @RequestMapping("hello") public ModelAndView hello() { System.out.println("hello springmvc"); ModelAndView mav = new ModelAndView(); //设置模型数据 用于传递给jsp mav.addObject("msg","hello springmvc"); //设置视图名字 用于响应用户 mav.setViewName("/WEB-INF/jsp/hello.jsp"); return mav; } }
jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta charset="UTF-8"> <title>输出提示</title> </head> <body> ${ msg } </body> </html>
配置 dispatcherServlet 到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>Springmvc</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> <!-- 核心控制器 --> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
配置Spring的包扫描 (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: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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置controller扫描包 (spring 里面的包扫描) --> <context:component-scan base-package="com.toov5.mvc.controller" /> </beans>
spring的配置文件需要加载:(之前通过web监听器加载)
springmvc的可以通过 FrameworkiServlet 这个父类的属性: contextConfigLocation
父类中:
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>Springmvc</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> <!-- 核心控制器 --> <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:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
目录结构:
访问:
访问过程:
*.action 被servlet拦截 这个servlet由 DispatcherServlet处理,接下来 通过配置文件(springmvc.xml)进行初始化参数进行初始化
springmvc.xml 有包扫描,获取带@Controller的Java类文件,识别为控制器,然后进入控制器里面了,通过扫描识别到@RequestMapping("hello") 绑定用户请求 ,然后执行具体的代码
通过右键项目名称可以修改访问时候的 根路径名称
WEB-INF 不可以直接返回提高了安全性
商品列表展示:
package com.toov5.mvc.controller; import java.util.Arrays; import java.util.Date;import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.toov5.mvc.pojo.Item; @Controller public class ItemController { @RequestMapping("itemList") public ModelAndView itemList() { ModelAndView mav = new ModelAndView(); List<Item> list = Arrays.asList(new Item(1,"电脑",10000,new Date(),"配置好" ), new Item(2,"手机",10000,new Date(),"像素好" ), new Item(3,"洗衣机",10000,new Date(),"容量大" ) ); /*jsp通过itemList遍历之*/ mav.addObject("itemList",list); mav.setViewName("/WEB-INF/jsp/itemList.jsp"); return mav; } }
pojo:
package com.toov5.mvc.pojo; import java.util.Date; public class Item { private int id; private String name; private double price; private Date createtime; private String detail; public Item() { super(); } public Item(int id, String name, double price, Date createtime, String detail) { super(); this.id = id; this.name = name; this.price = price; this.createtime = createtime; this.detail = detail; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getDetail() { return detail; } public void setDetail(String detail) { this.detail = detail; } }
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 }/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>
sprimgmvc.xml 配置文件不用修改
访问: http://localhost:8080/itemList.action
分析:
如何通过一个 @RequestMapping绑定了请求 如何做到的?
通过Springmvc的源码包:
打开这个配置文件:
url请求到底是由哪个控制器处理,从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。
由上图可以看出 已经过期了
所以配置这个Bean:
<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
而且还需要处理器适配器的!目前也过期了!
所以也需要设置这个Bean
从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。
<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
解读:
处理器适配器:
@Controller的这个类 我们没有实例化 也没有手动去调用。这个是由处理器适配器工作实现的
以上的太繁琐,不容易配置和记忆:
简单粗暴配置注解驱动: 可以代替上面的两个Bean配置
<!-- 注解驱动配置,代替映射器与适配器的单独配置,同时支持json响应(推荐使用) 企业级开发 -->
<mvc:annotation-driven />
继续简化 mav.setViewName("/WEB-INF/jsp/itemList.jsp"); 路径名字也可以简化
Spring MVC中有个视图解析器,木有过期 请放心使用!
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置视图响应的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 配置视图响应的后缀 -->
<property name="suffix" value=".jsp" />
</bean>
配置:
<?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: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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置controller扫描包 (spring 里面的包扫描) --> <context:component-scan base-package="com.toov5.mvc.controller" /> <!-- 注解驱动配置,代替映射器与适配器的单独配置,同时支持json响应(推荐使用) --> <mvc:annotation-driven /> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置视图响应的前缀 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 配置视图响应的后缀 --> <property name="suffix" value=".jsp" /> </bean> </beans>
这样在controller里面 可以去掉前缀 后缀开发了:
package com.toov5.mvc.controller; import java.util.Arrays; import java.util.Date;import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.toov5.mvc.pojo.Item; @Controller public class ItemController { @RequestMapping("itemList") public ModelAndView itemList() { ModelAndView mav = new ModelAndView(); List<Item> list = Arrays.asList(new Item(1,"电脑",10000,new Date(),"配置好" ), new Item(2,"手机",10000,new Date(),"像素好" ), new Item(3,"洗衣机",10000,new Date(),"容量大" ) ); /*jsp通过itemList遍历之*/ mav.addObject("itemList",list); mav.setViewName("itemList"); //jsp的名字 return mav; } }
DispatchServlet是一个前端控制器,它会匹配通过设置的路径进行拦截,它是不能干活的。 第一个组件叫处理器映射器,绑定用户请求的。处理完之后,会根据用户的请求地址返回执行链(会有哪一个处理器(标记@Controller的)进行处理)
然后告诉前段处理器谁去处理,前端控制器去找到处理器适配器(HandlerAdapter),让它去创建实例,执行具体的方法(Handler)。Handler执行完毕后会返回ModelAndView给处理器适配器,然后处理器适配器去告诉前端控制器。然后去依赖视图解析器,请求视图解析器,视图解析器响应一个view对象。然后前端控制器收到后去调用视图组件渲染视图。最后通过前端控制器去响应给用户
Spring mvc里面的三大组件: 处理器映射器 处理器适配器 视图解析器
最核心的是前端控制器
Springmvc 整合 Mybatis
抽取开发 分开管理:
spring管理的 springmvc管理的 mybatis管理的
Dao层:
1、SqlMapConfig.xml,空文件即可。需要文件头。
2、applicationContext-dao.xml。
a) 数据库连接池
b) SqlSessionFactory对象,需要spring和mybatis整合包下的。
c) 配置mapper文件扫描器。
Service层:
1、applicationContext-service.xml包扫描器,扫描@service注解的类。
2、applicationContext-trans.xml配置事务。
Controller层:
Springmvc.xml
1、包扫描器,扫描@Controller注解的类。
2、配置注解驱动。
3、视图解析器
Web.xml
- 配置spring容量监听器
- 配置前端控制器
Dao的配置:
创建 SQL映射文件 和 Java接口的包 com.toov5.mvc.mapper
创建实体类Bean的包 com.toov5.mvc.pojo (作为别名标签的被扫描包)
创建Mybatis 的全局配置文件 SqlMapConfig.xml(为空的,交给Spring去管理了)
<?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>
创建Spring的配置文件 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:jdbc.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> <!-- SqlSessionFactory配置 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 加载mybatis核心配置文件 --> <property name="configLocation" value="classpath:SqlMapConfig.xml" /> <!-- 别名包扫描 --> <property name="typeAliasesPackage" value="com.toov5.mvc.pojo" /> </bean> <!-- 动态代理,第二种方式:包扫描(推荐) 扫描动态代理的映射文件和接口: --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- basePackage多个包用","分隔 --> <property name="basePackage" value="com.toov5.mvc.mapper" /> </bean> </beans>
Service层:
配置扫描包的标签配置 扫描@Service注解
配置事务管理:
首先要有事务管理器(Spring提供的) 需要数据源注入到Spring中
配置通知: 引用事务管理器 在这些通知里面建立事务传播行为
配置切面: 告知哪里去使用这些通知的切面
<?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:method name="query*" propagation="SUPPORTS" read-only="true" /> </tx:attributes> </tx:advice> <!-- 切面 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.toov5.mvc.service.*.*(..))" /> </aop:config> </beans>
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: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://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置@controller扫描包 --> <context:component-scan base-package="com.toov5.mvc.controller" /> <!-- 配置注解驱动,相当于同时使用最新处理器映射跟处理器适配器,对json数据响应提供支持 --> <mvc:annotation-driven /> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"/> <property name="suffix" value=".jsp"/> </bean> </beans>
最后配置 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>Springmvc</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:spring/applicationContext*.xml</param-value> </context-param> <!-- 使用监听器加载Spring配置文件 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 前端控制器 --> <servlet> <servlet-name>springmvc-web</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc-web</servlet-name> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
Dao层开发: 通过逆向工程
逆向文件生成:
Service:
接口和实现类的开发
package com.toov5.mvc.service; import java.util.List; import com.toov5.mvc.pojo.Item; public interface ItemService { List<Item> getItemList(); }
package com.toov5.mvc.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.toov5.mvc.mapper.ItemMapper; import com.toov5.mvc.pojo.Item; import com.toov5.mvc.service.ItemService; @Service public class ItemServiceImpl implements ItemService { @Autowired private ItemMapper iMapper; public List<Item> getItemList() { //想查询所有 传入空 return iMapper.selectByExample(null); } }
Controller:
package com.toov5.mvc.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.toov5.mvc.pojo.Item; import com.toov5.mvc.service.ItemService; @Controller public class ItemController { @Autowired private ItemService itemService; @RequestMapping("itemList") public ModelAndView itemList() { ModelAndView mav = new ModelAndView(); List<Item> itemList = itemService.getItemList(); mav.addObject("itemList",itemList); mav.setViewName("itemList"); //jsp的名字 return mav; } }
然后相应的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 }/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>
目录结构:
访问:http://localhost:8080/SSM01/itemList.action