纯Java配置SpringMvc-Freemarker-MyBatis

主要用于纯java整合mybatis,web成用freemarker,页面和之前博客一样

 

1.pom.xml

2.resources文件夹

jdc.properties 与之前博客一样

log4j.properties 与之前博客一样

mybatis-configuration.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>
    <!--此文件主要用于配置别名  -->
    <typeAliases>
        <typeAlias alias="User" type="com.niugang.entity.User" />
    </typeAliases>
 
</configuration>

mapper文件夹下放xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.niugang.dao.UserDao">
<resultMap id="BaseResultMap" type="User">
<result column="id" property="id" />
<result column="name" property="name" />
<result column="age" property="age" />
<result column="phone" property="phone" />
</resultMap>
     
<!--查询字段 -->
<sql id="Base_Column_List">
id, name, age,phone
</sql>
<!-- 查询条件 -->
<sql id="queryCondition">
<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="name!=null">
and name=#{name}
</if>
<if test="age!=null">
and age=#{age}
</if>
<if test="phone!=null">
and phone=#{phone}
</if>
</where>
</sql>


<select id="queryList" resultMap="BaseResultMap" parameterType="User">
select
<include refid="Base_Column_List" />
from user
<include refid="queryCondition" />
</select>
<insert id="save" parameterType="User">
insert into user (name,password,age,phone)
values(#{name},#{password},#{age},#{phone})
</insert>
<delete id="delete" parameterType="int">
delete from user where id =#{id}
</delete>
<select id="get" parameterType="int" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
where id =#{id}
</select>
</mapper>

3.WebInitializer .java

package com.niugang;



import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;



/**

* 相当于web.xml

* AbstractAnnotationConfigDispatcherServletInitializer 源码里面有解释

* 这个是注解形式注册

* DispatcherServlet容器

* @author niugang

*

*/

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

/**

* 源码里面与对此方法的解释 配置applicationContext

*/

@Override

protected Class<?>[] getRootConfigClasses() {//指定上下文配置类

return new Class<?>[]{RootConfig.class};

}



@Override

protected Class<?>[] getServletConfigClasses() {//指定sprinfgmvc配置类

return new Class<?>[]{SpringMVCconfig.class} ;

}



@Override

protected String[] getServletMappings() {

return new String[]{"/"}; //将DispatcherServlet请求映射的/上

}

4.SpringMVCconfig.java

package com.niugang;

import javax.servlet.ServletContext;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import org.springframework.web.servlet.view.freemarker.FreeMarkerView;

import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;

import freemarker.cache.WebappTemplateLoader;



/**

*

* @author niugang springmvc java配置文件

*/

@Configuration // 说明此类为配置文件类

@EnableWebMvc // 开启springmvc

@ComponentScan("com.niugang") // 组件扫描

public class SpringMVCconfig extends WebMvcConfigurerAdapter{

/**

* freemaker作为视图解析器

*

* @return

*/

@Bean

public FreeMarkerViewResolver viewResolver() {

FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();

resolver.setContentType("text/html;charset=utf-8");

/*

* 如果注释 resolver.setPrefix("/WEB-INF/views/");

* 下面config需要tplCfg.setTemplateLoader(new

* WebappTemplateLoader(servletContext,"/WEB-INF/views/"));

*/

resolver.setPrefix("/WEB-INF/views/");

resolver.setSuffix(".html");

resolver.setViewClass(FreeMarkerView.class);

return resolver;

}

/**

* 配置freemarker

* @param servletContext

* @return

*/

@Bean

public FreeMarkerConfigurer freeMarkerConfigurer(ServletContext servletContext) {

FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();

@SuppressWarnings("deprecation")

freemarker.template.Configuration tplCfg = new freemarker.template.Configuration();

tplCfg.setDefaultEncoding("UTF-8");

tplCfg.setTemplateLoader(new WebappTemplateLoader(servletContext));

freeMarkerConfigurer.setConfiguration(tplCfg);

return freeMarkerConfigurer;

}



/**

* 配置静态资源的处理 对静态资源的请求转发到容器缺省的servlet,而不使用DispatcherServlet

*/

@Override

public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {

configurer.enable();

}

}

5.RootConfig.java

package com.niugang;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.ComponentScan.Filter;

import org.springframework.context.annotation.Configuration;

import org.springframework.context.annotation.FilterType;

import org.springframework.context.annotation.Import;

import org.springframework.web.servlet.config.annotation.EnableWebMvc;

/**

* 上下文配置

* @author niugang

*

*/

@Configuration

@ComponentScan(basePackages={"con.niugang"},

excludeFilters={

@Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)

}

)

//在上下文中引入jdbc配置文件,事务配置文件

@Import({JdbcConfig.class,MybatisConfig.class,TransactionalConfig.class})

public class RootConfig {

}

6.JdbcConfig.java

package com.niugang;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;


/**
 * jdbc配置文件
 * 
 * @author niugang
 *
 */
@Configuration
/*
 * 
 * @PropertySource注解如何使用,源码里面有例子 即从配置文件中如何获取获取值,源码里面也有解释
 *
 */

@PropertySource("classpath:jdbc.properties")

public class JdbcConfig {
@Autowired
private Environment env;


/**
* 配置数据源
* 
* @return
*/
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setUrl(env.getProperty("url"));
dataSource.setDriverClassName(env.getProperty("driverName"));
dataSource.setUsername(env.getProperty("datausername"));
dataSource.setPassword(env.getProperty("password"));
return dataSource;
}

}

7.MybatisConfig.java

package com.niugang;
import java.io.IOException;
import javax.sql.DataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
/**
 * MyBatis配置文件
 * @author niugang
 *
 */
@Configuration
//Use this annotation to register MyBatis mapper interfaces when using Java
//源码里面也有样例

@MapperScan(basePackages="com.niugang.dao")

public class MybatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) throws IOException {
    ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();  
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();  
        sqlSessionFactoryBean.setDataSource(dataSource);  
        sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis-configuration.xml"));
        sqlSessionFactoryBean.setMapperLocations(resourcePatternResolver.getResources("classpath*:mapper/*.xml"));  
return sqlSessionFactoryBean;
}

}

8.TransactionalConfig.java

package com.niugang;
import javax.sql.DataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;


/**
 * 事务配置文件
 * 
 * @author niugang
 *
 */
@Configuration
@EnableTransactionManagement
/*
 * 事务具体配置可以参考 @EnableTransactionManagement里面源码的配置
 */
public class TransactionalConfig {

@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}

8.entity

package com.niugang.entity;



public class User {

private int id;

private String name;

private Integer age;

private String phone;

private String password;



public String getPassword() {

return password;

}



public void setPassword(String password) {

this.password = password;

}



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 Integer getAge() {

return age;

}



public void setAge(Integer age) {

this.age = age;

}



public String getPhone() {

return phone;

}



public void setPhone(String phone) {

this.phone = phone;

}



}

9.dao层

package com.niugang.dao;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.niugang.entity.User;

@Repository

public interface UserDao {

List<User> queryList(User user);



User get(Integer id);



void save(User user);



void delete(Integer id);



}

10.service层

package com.niugang.service;



import java.util.List;



import javax.annotation.Resource;

import javax.transaction.Transactional;



import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Service;



import com.niugang.dao.UserDao;

import com.niugang.entity.User;



@Service

public class UserService {



private static Logger logger = LoggerFactory.getLogger(UserService.class);

@Resource

private UserDao userDao;



public List<User> queryList(User user) {

logger.info("访问queryList方法");

return userDao.queryList(user);

}

@Transactional

public void save(User user) {

logger.info("访问save方法");

userDao.save(user);

}



public User get(Integer id) {

logger.info("访问get方法");

return userDao.get(id);

}



public void delete(Integer id) {

logger.info("访问delete方法");

userDao.delete(id);

}



}

11.controller

package com.niugang.controller;



import java.util.List;



import javax.annotation.Resource;



import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.stereotype.Controller;

import org.springframework.ui.ModelMap;

import org.springframework.web.bind.annotation.PathVariable;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import com.niugang.entity.User;

import com.niugang.service.IndexService;

import com.niugang.service.UserService;



@Controller

public class IndexController {



@Autowired

@Qualifier("indexService")

//private IndexService indexService;



@Resource

private UserService userService;

/**

* 默认访问的路径

*

* @return

*/

@RequestMapping(value = "/", method = RequestMethod.GET)

public String toindex() {

return "redirect:index";

}



@RequestMapping(value = "index", method = RequestMethod.GET)

public String index(ModelMap map) {

map.put("msg", indexService.printMsg());

return "index";

}



@RequestMapping(value = "error")

public void error() {

throw new RuntimeException("哎呀出错了");

}



@RequestMapping(value = "/list")

public String list(ModelMap map) {

List<User> list = userService.queryList(null);

map.put("users", list);

return "list";

}

@RequestMapping(value = "/detail/{id}")

public String detail(@PathVariable(value = "id") Integer id, ModelMap map) {

User user = userService.get(id);

map.put("user", user);

return "detail";

}



@RequestMapping(value = "toAdd")

public String toAdd() {

return "add";

}



@RequestMapping(value = "/save")

public String save(User user, ModelMap map) {

user.setPassword("123456");

userService.save(user);

return "redirect:/index";

}



}

11.aop包

 

WebLogAscept.java 用于web层日志记录

package com.niugang.aop;



import javax.servlet.http.HttpServletRequest;



import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.Around;

import org.aspectj.lang.annotation.Aspect;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.stereotype.Component;

import org.springframework.web.context.request.RequestAttributes;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;



/**

*

* @author niugang

*

*/

@Aspect

@Component

@EnableAspectJAutoProxy // 启用aop

public class WebLogAscept {



private Logger logger = LoggerFactory.getLogger(WebLogAscept.class);

/**

* 方式一 @Pointcut("execution(public * com.niugang.controller..*.*(..))")

* public void WebLogAscept() { }

*

* @Around(value = "WebLogAscept()") public Object

* aroundAdvice(ProceedingJoinPoint pjd) throws Throwable {

* logger.info("请求前"); Object proceed = pjd.proceed();

* logger.info("请求后");

*

* return proceed; //必须得有返回值,否则不能往下执行 }

**/

/**

* 方式二 在增强上配置匿名切点

*

* @param pjd

* @return

* @throws Throwable

*/

@Around("execution(public * com.niugang.controller..*.*(..))")

public Object aroundAdvice(ProceedingJoinPoint pjd) throws Throwable {

logger.info("请求前");

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

ServletRequestAttributes r = (ServletRequestAttributes) requestAttributes;

HttpServletRequest request = r.getRequest();

logger.info("url is {}", request.getRequestURL());

logger.info("request params is {}", request.getParameterMap() == null ? "" : request.getParameterMap());

Object proceed = pjd.proceed();

logger.info("请求后");



return proceed; // 必须得有返回值,否则不能往下执行

}



}

ExceptionControllerAscept.java 用于异常处理

package com.niugang.aop;



import java.io.IOException;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.aspectj.lang.annotation.AfterThrowing;

import org.aspectj.lang.annotation.Aspect;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

import org.springframework.stereotype.Component;

import org.springframework.web.context.request.RequestAttributes;

import org.springframework.web.context.request.RequestContextHolder;

import org.springframework.web.context.request.ServletRequestAttributes;



/**

* controller层统一异常处理

*

* @author niugang

*

*/

@Aspect

@Component

@EnableAspectJAutoProxy

public class ExceptionControllerAscept {



private Logger logger = LoggerFactory.getLogger(ExceptionControllerAscept.class);

/**

* 匿名切点的方式

* @param ex

* @throws ServletException

* @throws IOException

*/

@AfterThrowing(value = "execution(public * com.niugang.controller..*.*(..))", throwing = "ex")

public ModelAndView aroundAdvice(Exception ex) throws ServletException, IOException {
              /*RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes r = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = r.getRequest();
HttpServletResponse response = r.getResponse();*/
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("error");
//第一如果是 RuntimeException
if (ex instanceof RuntimeException) {
logger.error("抛出运行时异常{}", ex.getMessage());
modelAndView.addObject("errorMsg", ex.getMessage());
return modelAndView;
}
modelAndView.addObject("errorMsg", "未知异常");
return modelAndView;


}

       /*

     //自己平台测试用ModelAndView不行实现要想的功能,所以如果上面不行用下面返回jsp代码

     @AfterThrowing(value = "execution(public * com.niugang.controller..*.*(..))", throwing = "ex")
public void aroundAdvice(Exception ex) throws ServletException, IOException {
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes r = (ServletRequestAttributes) requestAttributes;
HttpServletRequest request = r.getRequest();
HttpServletResponse response = r.getResponse();
//第一如果是 RuntimeException
if (ex instanceof RuntimeException) {
logger.error("抛出运行时异常{}", ex.getMessage());
request.setAttribute("errorMsg", ex.getMessage());
//跳转到错误页面
request.getRequestDispatcher("/WEB-INF/views/error.jsp").forward(request, response);
}
}

      */



}

可能会用上如果用ModelAndView返回freemarker渲染的htmk没有到达预期就用error.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 http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    ${errorMsg}
    <a href="javascript:history.back(-1)">返回</a>
</body>
</html>

微信公众号 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
技术选型文档:Spring Boot,Spring MVC,MyBatis 1. 背景 本文档旨在介绍在开发一个基于Java的Web应用程序时选择的技术选型。本文档将涵盖以下方面: - 项目概述 - 技术选型的考虑因素 - 技术选型的决策 - 技术选型的理由 2. 项目概述 本项目是一个基于Java的Web应用程序,旨在提供一种简单的方式来管理和存储数据。该应用程序的核心功能包括: - 用户注册、登录和管理 - 数据的添加、修改和删除 - 数据的查询和筛选 3. 技术选型的考虑因素 在选择技术时,我们考虑了以下因素: - 功能和性能要求 - 开发人员技能 - 社区支持和文档 - 平台兼容性 - 可扩展性和可维护性 4. 技术选型的决策 在考虑各种技术选项时,我们决定采用如下技术: - Spring Boot:Spring Boot是一个快速开发框架,它提供了一种简单的方式来构建应用程序并提供基本的Web开发功能。 - Spring MVC:Spring MVC是一个基于MVC模式的Web框架,它提供了一种简单的方式来处理Web请求和响应。 - MyBatisMyBatis是一个简单的Java持久化框架,它提供了一种简单的方式来将Java对象映射到关系型数据库表。 5. 技术选型的理由 我们选择Spring Boot的原因是它提供了一种简单和快速的方式来构建应用程序,并且它提供了许多基本的Web开发功能,如自动配置和快速启动。这些功能可以使我们更加专注于业务逻辑。 我们选择Spring MVC的原因是它提供了一种简单的方式来处理Web请求和响应。Spring MVC支持多种视图技术,如JSP、Freemarker等。此外,它还提供了许多其他有用的功能,如拦截器、AOP等。 我们选择MyBatis的原因是它提供了一种简单的方式来将Java对象映射到关系型数据库表。MyBatis与Spring集成良好,并且它在处理大量数据时表现良好。此外,它还提供了许多其他有用的功能,如缓存和动态SQL。 综上所述,我们认为选择Spring Boot、Spring MVC和MyBatis是最好的选择,因为它们提供了一种简单和快速的方式来构建应用程序,并且它们在处理Web请求和响应以及数据持久化方面表现良好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值