目录
1.主要技术栈
mybatis+servlet+freemarker+layui
辅助功能:druid+logback
2.最终效果图
在此给出部分子模块功能图:
具体功能模块划分见下图:
3.学习该项目前提知识点提示
1.java基础
2.javaWeb基础知识,包括但不限于servlet,tomcat,三件套基础html5,css,js,以及jsp,freemarker等等知识
3.mysqsl基础增删改查以及简单的多表关联查询
4.mybatis框架的基本使用方法,最好先学会jdbc的基本操作
4.部分代码展示(文末有源码链接)
先放一张项目结构图:
此处的代码先供大家参考,如果你觉得有学习价值可以去文末拿源码。
@WebServlet(name = "IndexServlet", value = "/index")
public class IndexServlet extends HttpServlet {
private UserService userService = new UserService();
private PersonService personService = new PersonService();
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//得到当前登录用户
User user = (User) session.getAttribute("login_user");
Person person = personService.selectByIdentityId(user.getIdentityId());
//获取登录用户可用登录模块列表
List<Node> nodeList = userService.selectNodeByUserId(user.getUserId());
//放入请求属性
request.setAttribute("node_list",nodeList);
session.setAttribute("current_person",person); //这里的employee如果只是为index.ftl服务,则放入请求也可以,但由于考虑到实际上用户信息会在多处使用到,故提示其生存周期,放入session中
//请求派发至ftl进行展现
request.getRequestDispatcher("/index.ftl").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
@WebServlet(name = "LoginServlet", value = "/check_login")
public class LoginServlet extends HttpServlet {
private UserService userService = new UserService();
Logger logger = LoggerFactory.getLogger(LoginServlet.class); //日志输出组件
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//接收用户输入
String username = req.getParameter("username");
String password = req.getParameter("password");
Map<String,Object> result = new HashMap<>();
//调用业务逻辑
try {
User user = userService.checkLogin(username,password);
result.put("code",0); //编码为0,登录成功
result.put("message","success");
result.put("redirect_url","/index"); //登录成功,放入跳转的url地址
req.getSession().setAttribute("login_user",user); //将用户登录信息存放到当前会话窗口中
}catch (BussinessException ex){
logger.error(ex.getMessage(),ex);
result.put("code",ex.getCode());
result.put("message",ex.getMessage());
}catch (Exception ex){
logger.error(ex.getMessage(),ex);
result.put("code",ex.getClass().getSimpleName());
result.put("message",ex.getMessage());
}
//返回json结果
String json = JSON.toJSONString(result);
resp.getWriter().println(json);
}
}
public class DruidDataSourceFactory extends UnpooledDataSourceFactory {
public DruidDataSourceFactory(){
this.dataSource = new DruidDataSource(); //将mybatis的数据源指向第三方阿里巴巴的druid连接池
}
@Override
public DataSource getDataSource() { //注意是否要重写getDataSource取决于具体的连接池产品,druid连接池由于要进行初始化检查,强制要求重写,但对诸如c3p0的产品则没有这个要求 是否重写取决
try {
((DruidDataSource)this.dataSource).init(); //初始化druid数据源
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return this.dataSource;
}
}
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
}catch (IOException e){
throw new ExceptionInInitializerError(e);
}
}
/**
* 进行数据的查询操作
* @param func
* @return
*/
public static Object excuteQuery(Function<SqlSession,Object> func){ //传入一个函数式接口,传入参数为sqlSession,返回值为object;
SqlSession sqlSession = sqlSessionFactory.openSession();
System.out.println(sqlSession);
try {
Object obj = func.apply(sqlSession); //func中有个apply代表执行代码,至于执行什么交由外界传入,此外这里确保了连接的关闭
return obj;
}finally { //确保连接一定会关闭
sqlSession.close();
}
}
/**
* 进行数据的写操作,对比查询就是增加了事务的控制
* @param func 要执行的写操作代码块
* @return 要返回的结果
*/
public static Object excuteUpdate(Function<SqlSession,Object> func){ //传入一个函数式接口,传入参数为sqlSession,返回值为object;
SqlSession sqlSession = sqlSessionFactory.openSession(false);
System.out.println(sqlSession);
try {
Object obj = func.apply(sqlSession); //func中有个apply代表执行代码,至于执行什么交由外界传入,此外这里确保了连接的关闭
sqlSession.commit();
return obj;
}catch (RuntimeException e){
sqlSession.rollback();
throw e;
}finally { //确保连接一定会关闭
sqlSession.close();
}
}
}
5.结语
本项目是本人大二做的java课程设计,在此发帖纪念一下,同时也非常高兴分享给各位,希望能对你们的java学习有所帮助.如果大家有什么问题,也欢迎评论或私信讨论,共同进步!
百度网盘提取码:(里面有建表语句,注意数据库及web服务器的配置因人而异,要根据你的环境做修改)
链接:https://pan.baidu.com/s/1GVm9YQk0TRXmsD_0Xje19g
提取码:zjxv
--来自百度网盘超级会员V4的分享