博客测试:(第一次写博客)
mybatis:
SqlMapConfig.xml :
<!-- 懒加载根据需求进行添加 -->
<settings>
<settingname="lazyLoadingEnabled"value="true"/>
<settingname="aggressiveLazyLoading"value="false"/>
</settings>
<typeAliases>
<!-- 批量定义别名,扫描多个包,添加多个package -->
<packagename="com.oa.po"/>
</typeAliases>
数据库连接配置文件
db.properties
jdbc.driver=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=scott
jdbc.password=123456
这里将application.xml分成3个文件(本人是为了方便阅读)
applicationContext-dao.xml :(配置数据源与相关配置信息)
<!-- 加载配置文件 -->
<context:property-placeholderlocation="classpath:db.properties"/>
<!-- 数据源,使用dbcp -->
<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<propertyname="driverClassName"value="${jdbc.driver}"/>
<propertyname="url"value="${jdbc.url}"/>
<propertyname="username"value="${jdbc.username}"/>
<propertyname="password"value="${jdbc.password}"/>
<propertyname="maxActive"value="10"/>
<propertyname="maxIdle"value="5"/>
</bean>
<!-- sqlSessinFactory -->
<beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库连接池 -->
<propertyname="dataSource"ref="dataSource"/>
<!-- 加载mybatis的全局配置文件 -->
<propertyname="configLocation"value="classpath:mybatis/SqlMapConfig.xml"/>
</bean>
<!-- 扫描手写sql的xml包,在该包下,应该写上相关接口 -->
<beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
<propertyname="basePackage"value="com.clq.mapper"></property>
<propertyname="sqlSessionFactoryBeanName"value="sqlSessionFactory"/>
</bean>
applicationContext-service.xml :(加载ServiceImp)
<!-- spring方式注解注入-->
<context:annotation-config/>
<!-- 扫描所有包 -->
<context:component-scanbase-package="com.clq.service.impl"/>
applicationContext-transaction.xml : (数据库操作行为 --不做行为拦截,可能无法实现数据的插入,删除,修改)
<!-- 事务管理器 -->
<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<propertyname="dataSource"ref="dataSource"/>
</bean>
<!-- 通知 -->
<tx:adviceid="txAdvice"transaction-manager="transactionManager">
<tx:attributes>
<!-- 传播行为 -->
<tx:methodname="save*"propagation="REQUIRED"/>
<tx:methodname="delete*"propagation="REQUIRED"/>
<tx:methodname="insert*"propagation="REQUIRED"/>
<tx:methodname="update*"propagation="REQUIRED"/>
<tx:methodname="find*"propagation="SUPPORTS"read-only="true"/>
<tx:methodname="get*"propagation="SUPPORTS"read-only="true"/>
<tx:methodname="select*"propagation="SUPPORTS"read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- aop -->
<aop:config>
<aop:advisoradvice-ref="txAdvice"pointcut="execution(*com.clq.service.impl.*.*(..))"/>
</aop:config>
springmvc.xml :
<!-- 配置Handler扫描包 -->
<context:component-scanbase-package="com.oa.controller"/>
<!-- 访问静态页面
<mvc:resources location="/js/" mapping="/js/**"/>
-->
<!-- 配置 映射器和适配器-->
<mvc:annotation-drivenvalidator="validator"conversion-service="conversionservice"></mvc:annotation-driven>
<!-- 转换器 自定义参数绑定,会自动调用Date-->
<beanid="conversionservice"class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 转换器 -->
<propertyname="converters">
<list>
<!-- 自定义的类 -->
<beanclass="com.clq.controller.converter.ItemsDateConverter"/>
</list>
</property>
</bean>
<!-- 校验器 需要在实体类中对属性进行限制-->
<beanid="validator"class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!-- 校验器-->
<propertyname="providerClass"value="org.hibernate.validator.HibernateValidator"/>
<!-- 指定校验使用的资源文件,如果不指定则默认使用classpath下的ValidationMessages.properties -->
<propertyname="validationMessageSource"ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<beanid="messageSource"class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名-->
<propertyname="basenames">
<list>
<!-- 错误信息存放的文件 CustomValidationMessages.properties -->
<value>classpath:CustomValidationMessages</value>
</list>
</property>
<!-- 资源文件编码格式 -->
<propertyname="fileEncodings"value="utf-8"/>
<!-- 对资源文件内容缓存时间,单位秒 -->
<propertyname="cacheSeconds"value="120"/>
</bean>
<!-- 视图解析器 -->
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径的前缀 -->
<propertyname="prefix"value="/WEB-INF/jsp/"/>
<!-- 配置jsp路径的后缀 -->
<propertyname="suffix"value=".jsp"/>
</bean>
<!-- 文件上传 -->
<beanid="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB -->
<propertyname="maxUploadSize">
<value>5242880</value>
</property>
</bean>
<!--拦截器 -->
<mvc:interceptors>
<!--多个拦截器,顺序执行 -->
<!-- 登录验证拦截器 -->
<mvc:interceptor>
<mvc:mappingpath="/**"/>
<beanclass="com.clq.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
web.xml:
<!-- 加载spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!-- 读取多个 applicationContext.xml 配置文件-->
<param-value>/WEB-INF/classes/spring/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:spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 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>
Validator 校验:
配置文件 :CustomValidationMessages.properties
items.name.length.error=请输入1到30位的商品名称
实例对象检验方式:
@Size(min=1,max=30, message="{items.name.length.error}", groups={ValidGroup1.class})
private String name;
自定义日期转换器:
public classItemsDateConverter implements Converter<String, Date>{
public Date convert(Stringsource) {
// 将日期串转换成日期类型.格式(yyyy-mm-ddhh:mm:ss)
SimpleDateFormatsimpleDateFormat = new SimpleDateFormat("yyyy-MM-ddHH:mm:ss");
try {
// 转换成功
if (source !=null)
returnsimpleDateFormat.parse(source);
}catch(ParseException e) {
e.printStackTrace();
}
// 转换失败(参数绑定失败)
return null;
}
}
拦截器:
public classLoginInterceptor implements HandlerInterceptor{
。。。。。。
public booleanpreHandle(HttpServletRequest request, HttpServletResponse response,
Objectarg2) throwsException {
Stringurl = request.getRequestURI();
if (url.indexOf("UserLogin.action")> 0){// 表示url中包含UserLogin.action串
return true;
}
HttpSessionsession = request.getSession();
Useruser = (User) session.getAttribute("user");
if (user !=null){
return true;
}
request.getRequestDispatcher("index.jsp").forward(request,response);
return true;
}
}
Mapper.xml:
<!-- namespace:为接口路径 -->
<mappernamespace="com.clq.mapper.ItemsMapper">
<!-- 定义sql片段 -->
<sqlid="query_items_where">
<!-- 查询条件是 -->
<iftest="name!=null andname!=''">
items.nameLIKE '%${name}%'
</if>
</sql>
<selectid="findItemsList"parameterType="com.clq.po.Items"resultType="com.clq.po.Items">
SELECTitems.* FROM items
<where>
<includerefid="query_items_where"/>
</where>
</select>
<!-- 更新数据库 如果传入空值则会报错,因此需要进行类型转换 jdbcType -->
<updateid="updateItems"parameterType="Items">
UPDATE items set
name=#{name,jdbcType=VARCHAR},
price=#{price,jdbcType=NUMERIC},
detail=#{detail,jdbcType=VARCHAR},
pic=#{pic,jdbcType=VARCHAR},
createtime=#{createtime,jdbcType=DATE}
WHEREid=#{id}
</update>
</mapper>
实现接口:
public interfaceItemsMapper {
public List<Items>findItemsList(Items items);
public void updateItems(Itemsitems);
}
懒加载方式获取数据
<mappernamespace="com.oa.mapper.UserMapper">
<resultMaptype="User"id="UserAndDepartments">
<idcolumn="user_id"property="user_id"/>
<resultcolumn="depart_id"property="depart_id"/>
<resultcolumn="password"property="password"/>
<resultcolumn="name"property="name"/>
<resultcolumn="gender"property="gender"/>
<resultcolumn="phoneNumber"property="phoneNumber"/>
<resultcolumn="email"property="email"/>
<resultcolumn="description"property="description"/>
<associationproperty="department"javaType="com.oa.po.Department"select="com.oa.mapper.DepartmentMapper.getDepartmentById"column="depart_id"/>
</resultMap>
<!-- 查询所有 -->
<selectid="getAllUser"resultMap="UserAndDepartments">
SELECT* FROM Oa_user
</select>
<!-- 保存 -->
<insertid="saveUser"parameterType="User">
<selectKeykeyProperty="user_id"order="BEFORE"resultType="java.lang.Integer">
selectuser_sequence_tab.nextval as user_id from dual
</selectKey>
insertinto Oa_user(user_id, depart_id, loginName, password, name, phoneNumber, email,description, gender)
<iftest="depart_id ==0">
values(#{user_id,jdbcType=NUMERIC}, null, #{loginName,jdbcType=VARCHAR},#{password,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR},#{phoneNumber,jdbcType=VARCHAR}, #{email, jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR})
</if>
<iftest="depart_id !=0">
values(#{user_id,jdbcType=NUMERIC}, #{depart_id, jdbcType=NUMERIC},#{loginName,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR}, #{phoneNumber,jdbcType=VARCHAR},#{email,jdbcType=VARCHAR}, #{description,jdbcType=VARCHAR},#{gender,jdbcType=VARCHAR})
</if>
</insert>
<!-- 更新 -->
<updateid="updateUser"parameterType="User">
updateOa_user set
<iftest="depart_id !=0">
depart_id=#{depart_id,jdbcType=NUMERIC},
</if>
loginName=#{loginName,jdbcType=VARCHAR},
name=#{name,jdbcType=VARCHAR},
gender=#{gender,jdbcType=VARCHAR},
phoneNumber=#{phoneNumber,jdbcType=VARCHAR},
email=#{email,jdbcType=VARCHAR},
description=#{description,jdbcType=VARCHAR}
WHEREuser_id=#{user_id}
</update>
<!-- 删除 -->
<deleteid="deleteUserById"parameterType="int">
deletefrom Oa_user where user_id=#{id, jdbcType=NUMERIC}
</delete>
</mapper>
<!-- 分页查询 -->
<select id="getTopicByPagebean" parameterType="PageCase" resultMap="TopicAll">
SELECT * FROM ( SELECT t.*, rownum rn FROM (
SELECT * FROM Oa_topic t WHERE t.forum_id=#{id} ORDER BY (CASE t.type WHEN 2 THEN 2 ELSE 0 END) DESC, t.lastUpdateTime DESC
) t WHERE rownum < #{lastLine}) WHERE rn > #{firstLine}
</select>
@Controller
//定义根路径。最终访问路径为根路径+子路径
@RequestMapping("/items")
public classItemsController {
//@Autowired
@Resource private ItemsServiceitemsService;
// itemstypes表示最终自动将方法返回值放在request的key
@ModelAttribute("itemstypes")
public Map<String,String> getItemsType(){
Map<String,String> itemsType = new HashMap<String, String>();
itemsType.put("101", "天堂");
itemsType.put("102", "地狱");
return itemsType;
}
//@ModelAttribute 可以用于数据回显 @RequestMapping("queryItems.action")
public StringqueryItems(HttpServletRequest request,@ModelAttribute("items") Items items){
List<Items>itemsList = itemsService.findItemsList(items);
request.setAttribute("itemsList",itemsList);
// 返回视图
return"/WEB-INF/jsp/items/itemsList.jsp";
}
// 传进来的参数要与页面传进来的key相同,或者用@Param()
@RequestMapping("editItems.action")
public ModelAndVieweditItems(Integer id){
Itemsitems = newItems();
items= itemsService.findItemsById(id);
ModelAndViewmodelAndView = newModelAndView();
modelAndView.addObject("items",items);
modelAndView.setViewName("/WEB-INF/jsp/items/editItems.jsp");
return modelAndView;
}
/** *
* 在需要检验的pojo前面添加@Validated
*@param bindingResult:接受检验出错的信息(和@Validated是配对出现的,且位置顺序固定)
* @return
* @throws IOException
* @throws IllegalStateException
* @ModelAttribute("items") 用于数据回显
*/
@RequestMapping("editItemsSubmit.action")
public StringeditItemsSubmit(Model model, HttpServletRequest request,
@ModelAttribute("items")@Validated(value={ValidGroup1.class}) Items items,BindingResult bindingResult,
MultipartFileitems_pic) throwsIllegalStateException, IOException{
/* 页面中传进来的相应的参数名与items对象中的属性名一致
* 则会将数据保存到items中
* */
// 获取检验错误信息
if(bindingResult.hasErrors()){
// 输出错误信息
List<ObjectError>allErrors = bindingResult.getAllErrors();
for (ObjectErrorobjectError : allErrors){
// 输出错误信息 objectError.getDefaultMessage()
System.out.println(newString(objectError.getDefaultMessage().getBytes("ISO-8859-1"),"utf-8"));
}
request.setAttribute("allErrors",allErrors);
/*
* <c:forEach items="${allErrors}"var="allErrors">
* ${allErrors.defaultMessage}
* </c:forEach>
*
* */
return"/WEB-INF/jsp/items/editItems.jsp";
}
// 上传图片
// 获取图片原始名称
StringoriginalFilename = items_pic.getOriginalFilename();
if (items_pic !=null &&originalFilename !=null && originalFilename.length()>0){
ServletContextservletContext = request.getSession().getServletContext();
StringrealPath = servletContext.getRealPath("/image");
// 新建随机数文件名 uuid+源文件的扩展名
StringnewFileName = UUID.randomUUID()+originalFilename.substring(originalFilename.lastIndexOf("."));
// 新的图片
FilenewFile = newFile(newFile(realPath), newFileName);
if(!newFile.getParentFile().exists()){
newFile.getParentFile().mkdirs();
}
// 将图片写入磁盘(上传图片)
items_pic.transferTo(newFile);
// 将图片文件名放入属性
items.setPic(newFileName);
}
itemsService.updateItems(items);
return"redirect:/items/queryItems.action";
// 转向
//return "forward:queryItems.action";
}
// 批量删除
@RequestMapping("deleteItems.action")
public StringdeleteItems(Integer[] item_id){
System.out.println("勾选长度="+item_id.length);
// 根据id批量删除
return"/WEB-INF/jsp/success.jsp";
}
/**
* 请求json,输出json
* @RequestBody Items items:将json对象转换成items对象(属性名必须一样)
* @ResponseBody Items :将Items对象转换成json输出
* @paramitems
* @return
*/
@RequestMapping("requestJson.action")
public @ResponseBody ItemsrequestJson(@RequestBodyItems items){
return items;
}
//请求key/value,输出是json
@RequestMapping("responseJson.action")
public @ResponseBody ItemsresponseJson(Items items){
return items;
}
}