作者对javaweb开发了解并不深,此项目为练手学习之用,大牛请绕道或添加过滤器。
首先看用到的jar包,通过几个钟头的排错,jar包终于搞齐了。
源码结构图,此图也是作者通过网上搜寻查找总结的结果。
webContent目录:
web.xml源码:
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>homeBank</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 加载Spring容器配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 设置Spring容器加载配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-*.xml</param-value>
</context-param>
<!-- 配置Spring核心控制器 -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/applicationContext-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 拦截匹配规则 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 解决工程编码过滤器 -->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<?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"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 自动扫描的包名,扫描springmvc的注解 -->
<context:component-scan base-package="system.homebank"/>
<!-- annotation默认的方法映射适配器 -->
<bean id="handlerMapping" class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<bean id="handlerAdapter" class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonHttpMessageConverter"/>
</list>
</property>
</bean>
<!-- json转换,需配置编码格式,否则乱码 -->
<bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/"/>
<property name="suffix" value=".jsp"/>
<property name="contentType" value="text/html; charset=utf-8"/>
</bean>
</beans>
applicationContext-common.xml,主要配置数据源以及配置扫描mybatis的所有mapper的接口
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
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.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:mybatis/jdbc.properties"/>
<!--创建数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/homebank" />
<property name="username" value="homebank" />
<property name="password" value="111111" />
</bean>
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:mybatis/config.xml"/>
<property name="mapperLocations">
<list>
<value>classpath:system/homebank/entity/*.xml</value>
</list>
</property>
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="system.homebank.mapper"/>
<property name="markerInterface" value="system.homebank.mapper.BaseMapper"/>
</bean>
</beans>
上面的MapperScannerConfigurer配置会扫描BaseMapper下的所有接口,这样就不用单独为每一个接口配置一个bean。数据源的配置没有通过jdbc.properties文件,因为用户名总是读取计算机名而不是文件中配置的用户名,我也不知道为啥。
applicationContext-bean.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:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="system.homebank.controller"/>
<context:component-scan base-package="system.homebank.service"/>
<context:component-scan base-package="system.homebank.dao"/>
</beans>
上面的配置会自动扫描包下的注解的类,此配置文件中还可以配置其它的一些非注解的类。
下面看mybatis的配置,config.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>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="true"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25000"/>
</settings>
<typeAliases>
<typeAlias type="system.homebank.entity.User" alias="User" />
</typeAliases>
</configuration>
以上是几个要命的配置文件,下面的内容就简单了。
首先是实体类User:
package system.homebank.entity;
import java.io.Serializable;
public class User implements Serializable
{
private static final long serialVersionUID = 1085062678388838031L;
private Integer id;
private String username;
private String password;
public Integer getId()
{
return id;
}
public void setId(Integer id)
{
this.id = id;
}
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
}
然后为其配一个接口,实现增删改查等,本例只定义获取list的功能:
package system.homebank.mapper;
import java.util.List;
import system.homebank.entity.User;
public interface UserMapper extends BaseMapper
{
public List<User> getAllUser();
}
BaseMapper接口不定义任何方法:
package system.homebank.mapper;
public interface BaseMapper
{
}
接下来定义此实体与数据库表的映射配置,一个实体对应一个这样的配置,UserMapper.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="system.homebank.mapper.UserMapper" >
<resultMap id="userResultMap" type="system.homebank.entity.User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="password" column="password"/>
</resultMap>
<select id="getAllUser" resultType="list" resultMap="userResultMap">
select * from user
</select>
</mapper>
resultMap中定义了实体与库表的字段关系,select标签中的id对应的是上面UserMapper接口中的方法名,其他的内容都好理解。
以上是所有关于mybaits的配置,下面就是结构清晰的MVC三层了。
dao层如下:
UserDao.java
package system.homebank.dao;
import java.util.List;
import system.homebank.entity.User;
public interface UserDao
{
public List<User> getAllUser();
}
UserDaoImpl.java
package system.homebank.dao;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Repository;
import system.homebank.entity.User;
import system.homebank.mapper.UserMapper;
@Repository
public class UserDaoImpl implements UserDao
{
@Resource
private UserMapper mapper;
@Override
public List<User> getAllUser()
{
return this.mapper.getAllUser();
}
}
@Repository标签一般表示是dao层的服务;@Resouce标签属性将自动注入。
service层如下:
UserService.java
package system.homebank.service;
import java.util.List;
import system.homebank.entity.User;
public interface UserService
{
public List<User> getAllUser();
}
UserServiceImpl.java
package system.homebank.service;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import system.homebank.dao.UserDao;
import system.homebank.entity.User;
@Service
public class UserServiceImpl implements UserService
{
@Resource
private UserDao dao;
@Override
public List<User> getAllUser()
{
return this.dao.getAllUser();
}
}
@Service标签一般表示是服务层服务。
cotroller层如下:
UserController.java
package system.homebank.controller;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import system.homebank.entity.User;
import system.homebank.service.UserService;
@Controller
@RequestMapping("/userController")
public class UserController
{
@Resource
private UserService service;
@RequestMapping("/list.do")
@ResponseBody
public Object list(Model model)
{
List<User> list = service.getAllUser();
return list;
}
}
这样,list方法的访问路径就是/userController/list.do,@ResponseBody标签表示直接返回结果到页面。
后台代码到此为止。
以下为jsp页面和前台代码:
index.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">
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path ;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<a href="<%=basePath%>/jsp/listUser.jsp">点击</a>
</body>
</html>
listUser.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path ;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css"
href="<%=basePath%>/res/css/easyui/default/easyui.css">
<link rel="stylesheet" type="text/css" href="<%=basePath%>/res/css/easyui/icon.css">
<script type="text/javascript" src="<%=basePath%>/res/js/jquery.min.js"></script>
<script type="text/javascript" src="<%=basePath%>/res/js/jquery.easyui.min.js"></script>
<script type="text/javascript" src="<%=basePath%>/res/js/easyui-lang-zh_CN.js"></script>
<script>
$(function(){
$('#dg').datagrid({
url:'<%=basePath%>/userController/list.do',
columns:[[
{field:'id',title:'id',width:100},
{field:'username',title:'username',width:100},
{field:'password',title:'password',width:100}
]],
onLoadSuccess:function(data){
}
});
});
</script>
</head>
<body>
<table id="dg"></table>
</body>
</html>
ok,可以访问了:http://localhost:8080/homeBank/index.jsp