产品添加
从product-list.jsp跳转到product-add.jsp
< button type= "button" class = "btn btn-default" title= "新建" onclick= "location.href='${pageContext.request.contextPath}/pages/product-add.jsp'" > < i
class = "fa fa-file-o" > < / i> 新建
< / button>
product-add.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 -- >
< meta charset= "utf-8" >
< meta http- equiv= "X-UA-Compatible" content= "IE=edge" >
< title> 数据 - AdminLTE2定制版< / title>
< meta name= "description" content= "AdminLTE2定制版" >
< meta name= "keywords" content= "AdminLTE2定制版" >
< ! -- Tell the browser to be responsive to screen width -- >
< meta
content= "width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"
name= "viewport" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/bootstrap/css/bootstrap.min.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/font-awesome/css/font-awesome.min.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/ionicons/css/ionicons.min.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/iCheck/square/blue.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/morris/morris.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/datepicker/datepicker3.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.theme.default.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/select2/select2.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/bootstrap-markdown/css/bootstrap-markdown.min.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/adminLTE/css/AdminLTE.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/adminLTE/css/skins/_all-skins.min.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/css/style.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.skinNice.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/bootstrap-slider/slider.css" >
< link rel= "stylesheet"
href= "${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.css" >
< / head>
< body class = "hold-transition skin-purple sidebar-mini" >
< div class = "wrapper" >
< ! -- 页面头部 -- >
< jsp: include page= "header.jsp" > < / jsp: include>
< ! -- 页面头部 / -- >
< ! -- 导航侧栏 -- >
< jsp: include page= "aside.jsp" > < / jsp: include>
< ! -- 导航侧栏 / -- >
< ! -- 内容区域 -- >
< div class = "content-wrapper" >
< ! -- 内容头部 -- >
< section class = "content-header" >
< h1>
产品管理 < small> 产品表单< / small>
< / h1>
< ol class = "breadcrumb" >
< li> < a href= "${pageContext.request.contextPath}/index.jsp" > < i
class = "fa fa-dashboard" > < / i> 首页< / a> < / li>
< li> < a
href= "${pageContext.request.contextPath}/product/findAll.do" > 产品管理< / a> < / li>
< li class = "active" > 产品表单< / li>
< / ol>
< / section>
< ! -- 内容头部 / -- >
< form action= "${pageContext.request.contextPath}/product/save.do"
method= "post" >
< ! -- 正文区域 -- >
< section class = "content" > < ! -- 产品信息-- >
< div class = "panel panel-default" >
< div class = "panel-heading" > 产品信息< / div>
< div class = "row data-type" >
< div class = "col-md-2 title" > 产品编号< / div>
< div class = "col-md-4 data" >
< input type= "text" class = "form-control" name= "productNum"
placeholder= "产品编号" value= "" >
< / div>
< div class = "col-md-2 title" > 产品名称< / div>
< div class = "col-md-4 data" >
< input type= "text" class = "form-control" name= "productName"
placeholder= "产品名称" value= "" >
< / div>
< div class = "col-md-2 title" > 出发时间< / div>
< div class = "col-md-4 data" >
< div class = "input-group date" >
< div class = "input-group-addon" >
< i class = "fa fa-calendar" > < / i>
< / div>
< input type= "text" class = "form-control pull-right"
id= "datepicker-a3" name= "departureTime" >
< / div>
< / div>
< div class = "col-md-2 title" > 出发城市< / div>
< div class = "col-md-4 data" >
< input type= "text" class = "form-control" name= "cityName"
placeholder= "出发城市" value= "" >
< / div>
< div class = "col-md-2 title" > 产品价格< / div>
< div class = "col-md-4 data" >
< input type= "text" class = "form-control" placeholder= "产品价格"
name= "productPrice" value= "" >
< / div>
< div class = "col-md-2 title" > 产品状态< / div>
< div class = "col-md-4 data" >
< select class = "form-control select2" style= "width: 100%"
name= "productStatus" >
< option value= "0" selected= "selected" > 关闭< / option>
< option value= "1" > 开启< / option>
< / select>
< / div>
< div class = "col-md-2 title rowHeight2x" > 其他信息< / div>
< div class = "col-md-10 data rowHeight2x" >
< textarea class = "form-control" rows= "3" placeholder= "其他信息"
name= "productDesc" > < / textarea>
< / div>
< / div>
< / div>
< ! -- 订单信息/ -- > < ! -- 工具栏-- >
< div class = "box-tools text-center" >
< button type= "submit" class = "btn bg-maroon" > 保存< / button>
< button type= "button" class = "btn bg-default"
onclick= "history.back(-1);" > 返回< / button>
< / div>
< ! -- 工具栏/ -- > < / section>
< ! -- 正文区域 / -- >
< / form>
< / div>
< ! -- 内容区域 / -- >
< ! -- 底部导航 -- >
< footer class = "main-footer" >
< div class = "pull-right hidden-xs" >
< b> Version< / b> 1.0 .8
< / div>
< strong> Copyright & copy; 2014 - 2017 < a
href= "http://www.itcast.cn" > 研究院研发部< / a> .
< / strong> All rights reserved. < / footer>
< ! -- 底部导航 / -- >
< / div>
< script
src= "${pageContext.request.contextPath}/plugins/jQuery/jquery-2.2.3.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/jQueryUI/jquery-ui.min.js" > < / script>
< script>
$. widget. bridge ( 'uibutton' , $. ui. button) ;
< / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap/js/bootstrap.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/raphael/raphael-min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/morris/morris.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/sparkline/jquery.sparkline.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-1.2.2.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/jvectormap/jquery-jvectormap-world-mill-en.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/knob/jquery.knob.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/daterangepicker/moment.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/daterangepicker/daterangepicker.zh-CN.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/datepicker/bootstrap-datepicker.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/datepicker/locales/bootstrap-datepicker.zh-CN.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.all.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/slimScroll/jquery.slimscroll.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/fastclick/fastclick.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/iCheck/icheck.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/adminLTE/js/app.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/treeTable/jquery.treetable.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/select2/select2.full.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/colorpicker/bootstrap-colorpicker.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-wysihtml5/bootstrap-wysihtml5.zh-CN.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/bootstrap-markdown.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-markdown/locale/bootstrap-markdown.zh.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/markdown.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-markdown/js/to-markdown.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/ckeditor/ckeditor.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.date.extensions.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/input-mask/jquery.inputmask.extensions.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/datatables/jquery.dataTables.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/datatables/dataTables.bootstrap.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/chartjs/Chart.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/flot/jquery.flot.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/flot/jquery.flot.resize.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/flot/jquery.flot.pie.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/flot/jquery.flot.categories.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/ionslider/ion.rangeSlider.min.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-slider/bootstrap-slider.js" > < / script>
< script
src= "${pageContext.request.contextPath}/plugins/bootstrap-datetimepicker/bootstrap-datetimepicker.min.js" > < / script>
< script>
$( document) . ready ( function ( ) {
$( ".select2" ) . select2 ( ) ;
$( ".textarea" ) . wysihtml5 ( {
locale : 'zh-CN'
} ) ;
} ) ;
function setSidebarActive ( tagUri) {
var liObj = $( "#" + tagUri) ;
if ( liObj. length > 0 ) {
liObj. parent ( ) . parent ( ) . addClass ( "active" ) ;
liObj. addClass ( "active" ) ;
}
}
$( document) . ready ( function ( ) {
$( '#datepicker-a3' ) . datetimepicker ( {
format : "yyyy-mm-dd hh:ii" ,
autoclose : true ,
todayBtn : true ,
language : "zh-CN"
} ) ;
} ) ;
$( document) . ready ( function ( ) {
setSidebarActive ( "order-manage" ) ;
$( "#datepicker-a3" ) . datetimepicker ( {
format : "yyyy-mm-dd hh:ii" ,
} ) ;
} ) ;
< / script>
< / body>
< / html>
controller产品添加
package com. itheima. ssm. controller;
import com. itheima. ssm. domain. Product;
import com. itheima. ssm. service. IProductService;
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 javax. annotation. security. RolesAllowed;
import java. util. List;
@Controller
@RequestMapping ( "/product" )
public class ProductController {
@Autowired
private IProductService productService;
@RequestMapping ( "/save.do" )
public String save ( Product product) throws Exception {
productService. save ( product) ;
return "redirect:findAll.do" ;
}
@RequestMapping ( "/findAll.do" )
@RolesAllowed ( "ADMIN" )
public ModelAndView findAll ( ) throws Exception {
ModelAndView mv = new ModelAndView ( ) ;
List< Product> ps = productService. findAll ( ) ;
mv. addObject ( "productList" , ps) ;
mv. setViewName ( "product-list" ) ;
return mv;
}
}
service层ProduceServiceImp
package com. itheima. ssm. service. impl;
import com. itheima. ssm. dao. IProductDao;
import com. itheima. ssm. domain. Product;
import com. itheima. ssm. service. IProductService;
import org. springframework. beans. factory. annotation. Autowired;
import org. springframework. stereotype. Service;
import org. springframework. transaction. annotation. Transactional;
import java. util. List;
@Service
@Transactional
public class ProduceServiceImp implements IProductService {
@Autowired
private IProductDao productDao;
@Override
public List< Product> findAll ( ) throws Exception {
return productDao. findAll ( ) ;
}
@Override
public void save ( Product product) throws Exception {
productDao. save ( product) ;
}
}
dao
@Insert ( "insert into product(productNum,productName,cityName,departureTime,productPrice,productDesc,productStatus) values(#{productNum},#{productName},#{cityName},#{departureTime},#{productPrice},#{productDesc},#{productStatus})" )
public void save ( Product product) throws Exception;
添加日志
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j. rootCategory= INFO, CONSOLE debug info warn error fatal
log4j. rootCategory= debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j. logger. org. apache. axis. enterprise= FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j. appender. CONSOLE= org. apache. log4j. ConsoleAppender
log4j. appender. CONSOLE. layout= org. apache. log4j. PatternLayout
log4j. appender. CONSOLE. layout. ConversionPattern= % d{ ISO8601} % - 6 r [ % 15.15 t] % - 5 p % 30.30 c % x - % m\n
# LOGFILE is set to be a File appender using a PatternLayout.
# log4j. appender. LOGFILE= org. apache. log4j. FileAppender
# log4j. appender. LOGFILE. File= d: \axis. log
# log4j. appender. LOGFILE. Append= true
# log4j. appender. LOGFILE. layout= org. apache. log4j. PatternLayout
# log4j. appender. LOGFILE. layout. ConversionPattern= % d{ ISO8601} % - 6 r [ % 15.15 t] % - 5 p % 30.30 c % x - % m\n
类型转换
# spring mvc绑定参数之类型转换有三种方式:
## 1. 实体类中加日期格式化注解
@DateTimeFormat ( pattern= "yyyy-MM-dd HH:mm" )
private Date creationTime;
## 2. 属性编辑器
spring3. 1 之前
在Controller类中通过@InitBinder 完成
@InitBinder
public void initBinder ( WebDataBinder webDataBinder) throws Exception{
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( "yyyy-MM-dd hh:mm" ) ;
simpleDateFormat. setLenient ( false ) ;
webDataBinder. registerCustomEditor ( Date. class , new CustomDateEditor ( simpleDateFormat , true ) ) ;
}
备注:自定义类型转换器必须实现PropertyEditor接口或者继承PropertyEditorSupport类
写一个类 extends propertyEditorSupport (implements PropertyEditor ){
public void setAsText ( String text) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat ( "yyyy -MM-dd hh:mm" ) ;
Date date = simpleDateFormat. parse ( text) ;
this . setValue ( date) ;
}
public String getAsTest ( ) {
Date date = ( Date) this . getValue ( ) ;
return this . dateFormat. format ( date) ;
}
}
## 3. 类型转换器Converter
全局类型转换
参考前期课程代码
在实体类上添加注解
@DateTimeFormat ( pattern= "yyyy-MM-dd HH:mm" )
private Date departureTime;