很多初学者想搭建一个springmvc项目,但是网上的教程东拼西凑的总是不能让人如愿,所以我今天写下这个博客,给没有成功的朋友一点借鉴,如有问题请指出,大家共同进步。
先说明下自己的工作环境:
1、jdk1.8
2、oracle11g
3、eclipse LUNA
4、tomcat 7
其实这些即便不一样也是可以搭建的,只是我觉得说明下自己的工作环境是种比较好的习惯。下面开始进入正题:
第一步:
打开你的eclipse,新建一个java web项目,在eclipse里,java web项目叫做Dynamic Web Project(有多少新手拼命的在eclips里找javaWeb项目却找不到的,反正我初学的时候真不知道,一通瞎找)。填写上你的项目名字,其他的基本不用修改,一路next,最后在Generate web.xml deployment descriptor前面的复选框打勾(这步用于生成web.xml文件),然后Finish。
第二步:
导入jar包,导入位置:/WebContent/WEB-INF/lib文件夹下,jar包和源文件我都会在后面提供下载。选中你的项目,鼠标右击项目,选择Properties,在弹出的页面左边导航栏选择Resource,右边有个Text file encoding,选择Other,下拉框选择UTF-8,apply,ok,保存(这一步不配置也可以,主要是避免后续开发出现的一些乱码问题)。
现在准备配置spring+springmvc+mybatis(oracle)的项目。现在大部分的项目都是分控制层,逻辑层,持久层,当然,也可以认为是mvc模式,model、view、controller,简单说就是每一块有每一块的功能,降低项目的耦合性,低耦合性的优点就是开发快,维护方便,可以重复使用。所以我们遵循着这个思路去配置springmvc项目。在这之前我先说下,我喜欢在Navigator下查看我的项目,所以大家觉得有需要可以和我一样,在window-show view-Navigator调处这个窗口,初次使用可能不太习惯,但后来会爱上这个窗口的。
第三步:
在src目录下新建一个folder,命名config(不是必须,这是一个习惯,看的更清楚),在这里配置spring和springmvc的一些xml文件。
在config下新建propery文件夹,用于保存一些properties类型的配置文件。
在src目录下新建一些将要用到的工作目录
com文件夹和bpdcc文件夹是一种命名规范,简单说就是如果你的项目打成jar包发到网上,怎么避免和别人的项目重名?用网址的唯一性来避免重复,从后往前依次命名,就是bpdcc.com(我没有自己的网址,但是我开源中国的账号叫奔跑的菜菜。。。)。
controller就是控制层,这里的文件都是和页面请求有关的,service就是所谓的逻辑层,页面请求发来,或许会有一些需要处理的运算,都写在这个文件夹下的类里,注意service文件夹里的都是接口,而service-impl里的是接口的实现类。
mapper是与数据库的交互,就是持久层,这里没有逻辑,没有页面,只管和数据库的交互,注意mapper里是接口,mapper-impl里是xml文件。
1、配置spring的xml文件。
新建一个xml文件,命名spring.xml(不是一定要叫这个名字,spring的配置文件有自己的命名规范,大家可以上网去找找,这里我用spring.xml表示是为了让大家更直接明了的看懂项目结构,下面命名除特殊申明,都是遵循该说明)
<?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-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<!-- 启动注解和POJO(java基本类) -->
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
</bean>
</beans>
2、配置spring-mvc.xml文件
新建一个xml文件,命名spring-mvc.xml。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" 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-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<!-- 扫描controller -->
<context:component-scan base-package="com.bpdcc.**.controller" />
<!-- 扫描service层 -->
<context:component-scan base-package="com.bpdcc.**.service" />
<!-- 视图模式下的前缀和后缀 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
3、配置spring-mybatis.xml文件和数据库的参数文件
新建一个properties类型文件,File-New-Other-Gerneral-File,这时是建立一个没有后缀名称的文件,可以命名为jdbc.properties。内容如下
dataSource_1.diverClassName=oracle.jdbc.driver.OracleDriver
dataSource_1.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
dataSource_1.username=admin
dataSource_1.password=admin
#定义初始连接数
dataSource_1.initialSize=5
#定义最大连接数
dataSource_1.maxActive=20
#定义最大空闲
dataSource_1.maxIdle=20
#定义最小空闲
dataSource_1.minIdle=1
#定义最长等待时间
dataSource_1.maxWait=60000
dataSource_1.testWhileIdle=true
dataSource_1.timeBetweenEvictionRunsMillis=3600000
dataSource_1.minEvictableIdleTimeMillis=3600000
dataSource_1.numTestsPerEvictionRun=3
dataSource_1.poolPreparedStatements=false
dataSource_1.maxOpenPreparedStatements=0
dataSource_1.defaultAutoCommit=true
dataSource_1.removeAbandoned=true
dataSource_1.removeAbandonedTimeout=300
dataSource_1.logAbandoned=false
新建一个xml文件,命名spring-mybatis.xml。
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!-- 引入数据库配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:/config/property/jdbc.properties" />
</bean>
<!-- 数据库配置 -->
<bean id="dataSource_1" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${dataSource_1.diverClassName}" />
<property name="url" value="${dataSource_1.url}" />
<property name="username" value="${dataSource_1.username}" />
<property name="password" value="${dataSource_1.password}" />
<property name="initialSize" value="${dataSource_1.initialSize}" />
<property name="maxActive" value="${dataSource_1.maxActive}" />
<property name="maxIdle" value="${dataSource_1.maxIdle}" />
<property name="minIdle" value="${dataSource_1.minIdle}" />
<property name="maxWait" value="${dataSource_1.maxWait}" />
<property name="testWhileIdle" value="${dataSource_1.testWhileIdle}" />
<property name="timeBetweenEvictionRunsMillis"
value="${dataSource_1.timeBetweenEvictionRunsMillis}" />
<property name="numTestsPerEvictionRun" value="${dataSource_1.numTestsPerEvictionRun}" />
<property name="minEvictableIdleTimeMillis" value="${dataSource_1.minEvictableIdleTimeMillis}" />
<property name="poolPreparedStatements" value="${dataSource_1.poolPreparedStatements}" />
<property name="maxOpenPreparedStatements" value="${dataSource_1.maxOpenPreparedStatements}" />
<property name="defaultAutoCommit" value="${dataSource_1.defaultAutoCommit}" />
<property name="removeAbandoned" value="${dataSource_1.removeAbandoned}" />
<property name="removeAbandonedTimeout" value="${dataSource_1.removeAbandonedTimeout}" />
<property name="logAbandoned" value="${dataSource_1.logAbandoned}" />
</bean>
<!-- 扫描dao层的接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.bpdcc.**.mapper" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- 扫描dao层的xml文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource_1" />
<property name="mapperLocations" value="classpath:com/bpdcc/**/mapper/impl/*.xml"></property>
</bean>
<!-- 事物管理 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource_1" />
</bean>
</beans>
4、配置web.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>springmvcDemo</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/*.xml</param-value>
</context-param>
<!-- 过滤器,所有文件参数用UTF-8编译 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- spring请求配置,指向springmvc的核心配置文件,并且定义所有以.xhtml结尾的请求都被springmvc拦截 ,加载顺序为1 -->
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<!-- spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- spring内存监听器 -->
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
<!-- session配置,生命周期为60分钟 -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
这时springmvc的项目已经配置好了,可以试着运行下,如果报这种找不到classes下某个文件的错误
多半是项目source配置错误,具体操作如下:
先在WEB-INF下建立一个classes文件夹,然后在project explorer视图下右击项目名称,Build Path-Configure Build Path-Java Build Path-Source-Default output folder ,选择新建的classes文件。这么做是将编译后的class文件 放在该目录下。
第四步:写一个简单的登录功能。
package com.bpdcc.controller;
import javax.servlet.http.HttpServletRequest;
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 com.bpdcc.model.User;
import com.bpdcc.service.LoginService;
@RequestMapping("/login/")//该类的访问路径
@Controller//一定要加这个注解
public class LoginController {
@Autowired
private LoginService loginService;
@RequestMapping("login")//该类下的具体某个方法的访问路径
public ModelAndView login(HttpServletRequest request){
ModelAndView mav = new ModelAndView("/login");
return mav;
}
@RequestMapping("loginResult")
public ModelAndView loginResult(HttpServletRequest request,User user){
ModelAndView mav = new ModelAndView("/result");
User resultUser = this.loginService.loginUser(user);
if(null!=resultUser&&user.getUsername().equals(resultUser.getUsername())){
mav.addObject("msg","用户:"+resultUser.getUsername()+"登录成功!");
}else{
mav.addObject("msg","用户名:"+user.getUsername()+"不存在或密码错误!");
}
return mav;
}
}
package com.bpdcc.service;
import com.bpdcc.model.User;
public interface LoginService {
/**
* 用户登录方法
* @param user
* @return
*/
User loginUser(User user);
}
package com.bpdcc.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.bpdcc.mapper.LoginMapper;
import com.bpdcc.model.User;
import com.bpdcc.service.LoginService;
@Service//一定要在实现类添加这个注解,注意是实现类,不是接口
public class LoginServiceImpl implements LoginService{
@Autowired
private LoginMapper loginMapper;
//用户登录方法
@Override
public User loginUser(User user) {
return this.loginMapper.loginUser(user);
}
}
package com.bpdcc.mapper;
import com.bpdcc.model.User;
public interface LoginMapper {
/**
* 用户登录方法
* @param user
* @return
*/
User loginUser(User user);
}
<?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.bpdcc.mapper.LoginMapper">
<!-- 用户登录方法 -->
<select id="loginUser" resultType="com.bpdcc.model.User">
select * from t_sys_user where username = #{username,jdbcType=VARCHAR} and password = #{password,jdbcType=VARCHAR}
</select>
</mapper>
package com.bpdcc.model;
/**
* t_sys_user
* @author bpdcc
*
*/
public class User {
private String id;
private String username;
private String password;
public String getId() {
return id;
}
public void setId(String 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;
}
}
我将所有代码都贴上来了,注意接口就放在对应层级的文件夹里,实现类在文件夹下的impl文件夹里
然后在WEB-INF里新建一个page文件夹,注意在WEB-INF文件夹下,文件都是不能直接访问的,所以在springmvc视图配置时,将页面文件放在WEB-INF下,安全性比较高。
两个页面如下:
1、登录页面
<%@ 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=UTF-8">
<title>登录页</title>
</head>
<body>
<form action="./loginResult.xhtml">
<table>
<tbody>
<tr>
<td>用户名:</td>
<td><input type="text" id="username" name="username" value="" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" id="password" name="password" value="" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" id="sub" name="sub" value="登录" />
</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
2、登录后的反馈页面
<%@ 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=UTF-8">
<title>登录结果</title>
</head>
<body>
${msg}
</body>
</html>
然后运行项目试试,如果提示找不到缺少bean,那一定是注解出错或者类没有被springmvc扫描到,检查配置文件。
代码手打,难免有漏字、错字、描述不清现象,欢迎大家批评指教,切勿人身攻击,如果觉得有用,就告诉我一声,给我点鼓励。
源文件及jar包下载:360云盘
http://yunpan.cn/cucc8AUfvkCiL 访问密码 7829