这两天在Spring + SpringMVC +Hibernate的基础上,将Hibernate 换成了Mybatis 进行整合。
虽然大部分的代码一致,但是就配置文件也是很让人跪。本人在写的时候由于扫描mapper 时,下到了mapper 包中,结果扫描不到Dao然后直接报创建不了工厂类(由于Dao在mapper的上级目录中)。
因为是第一次进行整合,所以没有使用了Maven。下面将代码贴进来。算做是笔记。(环境:eclipse + jdk 1.8 + Tomcat 7.0)
功能是:写一个功能简单的人员信息薄。包括(管理员的登录验证,管理员的注册,对信息的增删改查) 在管理员的登录和注册的时候使用了随机ID 和 加密(UUID , 验证码 + 密码 然后进行加密作为一个新的密码) 详细的见代码。
jar 包:
目录结构:
验证码:ValidationCodeServlet.java
package com.baijh.util;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.patchca.background.BackgroundFactory;
import org.patchca.color.ColorFactory;
import org.patchca.color.RandomColorFactory;
import org.patchca.filter.ConfigurableFilterFactory;
import org.patchca.filter.library.AbstractImageOp;
import org.patchca.filter.library.WobbleImageOp;
import org.patchca.font.RandomFontFactory;
import org.patchca.service.Captcha;
import org.patchca.service.ConfigurableCaptchaService;
import org.patchca.text.renderer.BestFitTextRenderer;
import org.patchca.word.RandomWordFactory;
public class ValidationCodeServlet extends HttpServlet {
private static final long serialVersionUID = 5126616339795936447L;
private ConfigurableCaptchaService configurableCaptchaService = null;
private ColorFactory colorFactory = null;
private RandomFontFactory fontFactory = null;
private RandomWordFactory wordFactory = null;
private BestFitTextRenderer textRenderer = null;
public ValidationCodeServlet() {
super();
}
/**
* Servlet销毁方法,负责销毁所使用资源. <br>
*/
public void destroy() {
wordFactory = null;
colorFactory = null;
fontFactory = null;
textRenderer = null;
configurableCaptchaService = null;
super.destroy(); // Just puts "destroy" string in log
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/png");
response.setHeader("cache", "no-cache");
HttpSession session = request.getSession(true);
OutputStream outputStream = response.getOutputStream();
// 得到验证码对象,有验证码图片和验证码字符串
Captcha captcha = configurableCaptchaService.getCaptcha();
// 取得验证码字符串放入Session
String validationCode = captcha.getChallenge();
session.setAttribute("validationCode", validationCode);
// 取得验证码图片并输出
BufferedImage bufferedImage = captcha.getImage();
ImageIO.write(bufferedImage, "png", outputStream);
outputStream.flush();
outputStream.close();
}
/**
* Servlet初始化方法
*/
public void init() throws ServletException {
configurableCaptchaService = new ConfigurableCaptchaService();
// 颜色创建工厂,使用一定范围内的随机色
colorFactory = new RandomColorFactory();
configurableCaptchaService.setColorFactory(colorFactory);
// 随机字体生成器
fontFactory = new RandomFontFactory();
fontFactory.setMaxSize(32);
fontFactory.setMinSize(28);
configurableCaptchaService.setFontFactory(fontFactory);
// 随机字符生成器,去除掉容易混淆的字母和数字,如o和0等
wordFactory = new RandomWordFactory();
wordFactory.setCharacters("abcdefghkmnpqstwxyz23456789");
wordFactory.setMaxLength(5);
wordFactory.setMinLength(4);
configurableCaptchaService.setWordFactory(wordFactory);
// 自定义验证码图片背景
MyCustomBackgroundFactory backgroundFactory = new MyCustomBackgroundFactory();
configurableCaptchaService.setBackgroundFactory(backgroundFactory);
// 图片滤镜设置
ConfigurableFilterFactory filterFactory = new ConfigurableFilterFactory();
List<BufferedImageOp> filters = new ArrayList<BufferedImageOp>();
WobbleImageOp wobbleImageOp = new WobbleImageOp();
wobbleImageOp.setEdgeMode(AbstractImageOp.EDGE_MIRROR);
wobbleImageOp.setxAmplitude(2.0);
wobbleImageOp.setyAmplitude(1.0);
filters.add(wobbleImageOp);
filterFactory.setFilters(filters);
configurableCaptchaService.setFilterFactory(filterFactory);
// 文字渲染器设置
textRenderer = new BestFitTextRenderer();
textRenderer.setBottomMargin(3);
textRenderer.setTopMargin(3);
configurableCaptchaService.setTextRenderer(textRenderer);
// 验证码图片的大小
configurableCaptchaService.setWidth(82);
configurableCaptchaService.setHeight(32);
}
/**
* 自定义验证码图片背景,主要画一些噪点和干扰线
*/
private class MyCustomBackgroundFactory implements BackgroundFactory {
private Random random = new Random();
public void fillBackground(BufferedImage image) {
Graphics graphics = image.getGraphics();
// 验证码图片的宽高
int imgWidth = image.getWidth();
int imgHeight = image.getHeight();
// 填充为白色背景
graphics.setColor(Color.WHITE);
graphics.fillRect(0, 0, imgWidth, imgHeight);
// 画100个噪点(颜色及位置随机)
for (int i = 0; i < 100; i++) {
// 随机颜色
int rInt = random.nextInt(255);
int gInt = random.nextInt(255);
int bInt = random.nextInt(255);
graphics.setColor(new Color(rInt, gInt, bInt));
// 随机位置
int xInt = random.nextInt(imgWidth - 3);
int yInt = random.nextInt(imgHeight - 2);
// 随机旋转角度
int sAngleInt = random.nextInt(360);
int eAngleInt = random.nextInt(360);
// 随机大小
int wInt = random.nextInt(6);
int hInt = random.nextInt(6);
graphics.fillArc(xInt, yInt, wInt, hInt, sAngleInt, eAngleInt);
// 画5条干扰线
if (i % 20 == 0) {
int xInt2 = random.nextInt(imgWidth);
int yInt2 = random.nextInt(imgHeight);
graphics.drawLine(xInt, yInt, xInt2, yInt2);
}
}
}
}
}
SQL 文件:
create database telbook;
use talbook;
create table manage(
id varchar(100) primary key auto_increment,
username varchar(20),
password varchar(100),
validatecode varchar(20)
);
create table person(
id int primary key,
name varchar(20),
salary float,
birthday date
);
下面是管理员的:
package com.nyist.dao;
import com.nyist.entity.Manage;
//定义管理员dao 接口
public interface ManageDao {
//登录检查
public Manage querymanage(String name);
//管理员注册
public void save(Manage manage);
}
ManageDaoMapper.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.nyist.dao.ManageDao" >
<select id="querymanage" parameterType="String" resultType="com.nyist.entity.Manage">
select * from manage where username = #{name}
</select>
<insert id="save" parameterType="com.nyist.entity.Manage">
insert into manage values(#{id},#{username},#{password},#{validatecode})
</insert>
</mapper>
package com.nyist.service;
import com.nyist.entity.Manage;
public interface ManageService {
public Manage queryManageByUserName(String username);
public void addManage(Manage manage);
}
package com.nyist.service.Impl;
import java.util.UUID;
import javax.annotation.Resource;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;
import com.nyist.dao.ManageDao;
import com.nyist.entity.Manage;
import com.nyist.service.ManageService;
//Service 业务层接口的实现
@Service()
public class ManageServiceImpl implements ManageService {
@Resource
private ManageDao managDao;
//依赖注入 ManageDao
@Override
public Manage queryManageByUserName(String username) {
return managDao.querymanage(username);
}
@Override
public void addManage(Manage manage) {
/**
* 由于存储数据需要进行转换,所以在这里我们需要从页面中获取的数据进行处理。
* ID 使用UUID 进行生产
*/
//ID 自动生成策略
manage.setId(UUID.randomUUID().toString());
//获得验证码
String validateCode = manage.getValidatecode();
String name = manage.getUsername();
//生成新的密码
String newpassword = manage.getPassword()+validateCode;
//对密码进行加密
String newpassword1 = DigestUtils.md5Hex(newpassword);
manage.setPassword(newpassword1);
manage.setUsername(name);
manage.setValidatecode(validateCode);
System.out.println(manage);
managDao.save(manage);
}
public ManageDao getManagDao() {
return managDao;
}
public void setManagDao(ManageDao managDao) {
this.managDao = managDao;
}
}
package com.nyist.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.nyist.entity.Manage;
import com.nyist.service.ManageService;
@Controller //控制器注解
@RequestMapping("/login.do")
public class ManageLogin {
@Autowired
private ManageService manageService;
//依赖注入
@RequestMapping(params="method=login")
public String login(Manage manage,HttpServletRequest request){
HttpSession session = request.getSession();
//验证码的验证
//程序 创建的验证码
String sysvacode = (String) session.getAttribute("validationCode");
//自己在页面输入的
String myvacode = manage.getValidatecode();
if(myvacode.equals(sysvacode)){
Manage manage1 = (Manage) manageService.queryManageByUserName(manage.getUsername());
//拼接密码 登录时写的密码加上我们存进的验证码 然后进行加密 和我们数据库中的密码进行判断。判断是否能成功登录
String mypassword = manage.getPassword() + manage1.getValidatecode();
//加密后的拼接的密码
String mypassword1 = DigestUtils.md5Hex(mypassword);
String sqlpassword = manage1.getPassword();
if(mypassword1.equals(sqlpassword)){
session.setAttribute("username", manage.getUsername());
return "redirect:personlist.do?method=personlist";
}
else{
//失败了重定向到login.jsp
return "redirect:login.jsp";
}
}else{
return "redirect:login.jsp";
}
}
}
package com.nyist.controller;
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.nyist.entity.Manage;
import com.nyist.service.ManageService;
@Controller //控制器注解
@RequestMapping("/reg.do")
public class ManageRegister {
@Autowired
private ManageService manageService;
@RequestMapping(params="method=reg")
public ModelAndView reg(Manage manage){
//使用ModelAndView 对象进行 页面的跳转
System.out.println(manage);
ModelAndView mv = new ModelAndView();
manageService.addManage(manage);
mv.setViewName("redirect:login.jsp");
return mv;
}
public ManageService getManageService() {
return manageService;
}
public void setManageService(ManageService manageService) {
this.manageService = manageService;
}
}
下面是Person 的功能实现
package com.nyist.dao;
import java.util.List;
import com.nyist.entity.Person;
public interface PersonDao {
public void save(Person person);
public void update(Person person);
public void delete(Person person);
public List<Person> queryAllPerson();
}
<?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.nyist.dao.PersonDao" >
<update id="update" parameterType="com.nyist.entity.Person">
update person set name=#{name},salary=#{salary},birthday=#{birthday} where id = #{id}
</update>
<insert id="save" parameterType="com.nyist.entity.Person">
insert into person values(#{id},#{name},#{salary},#{birthday})
</insert>
<delete id="delete" parameterType="com.nyist.entity.Person">
delete from person where id = #{id}
</delete>
<select id="queryAllPerson" resultType="com.nyist.entity.Person">
select * from person
</select>
</mapper>
package com.nyist.service;
import java.util.List;
import com.nyist.entity.Person;
public interface PersonService {
//增加数据
public void insertPerson(Person person);
//修改数据
public void updatePerson(Person person);
//删除数据
public void deletePerson(Person person);
//获取所有数据
public List<Person> queryAllPerson();
}
package com.nyist.service.Impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.nyist.dao.PersonDao;
import com.nyist.entity.Person;
import com.nyist.service.PersonService;
@Component
public class PersonServiceImpl implements PersonService{
@Autowired
private PersonDao persondao;
@Override
public void insertPerson(Person person) {
persondao.save(person);
}
@Override
public void updatePerson(Person person) {
persondao.update(person);
}
@Override
public void deletePerson(Person person) {
persondao.delete(person);
}
@Override
public List<Person> queryAllPerson() {
return persondao.queryAllPerson();
}
}
功能实现:Controller :
package com.nyist.controller;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import com.nyist.entity.Person;
import com.nyist.service.PersonService;
@Component
@RequestMapping("/addperson.do")
public class PersonAdd {
@Autowired
private PersonService personService;
@RequestMapping(params="method=addperson")
public String addperson(HttpServletRequest request) throws ParseException{
String name = request.getParameter("name");
float salary = Float.parseFloat(request.getParameter("salary"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date birthday1 = new Date((sdf.parse(request.getParameter("birthday"))).getTime());
Person p = new Person();
p.setName(name);
p.setSalary(salary);
p.setBirthday(birthday1);
personService.insertPerson(p);
return "redirect:personlist.do?method=personlist";
}
public PersonService getPersonService() {
return personService;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
}
package com.nyist.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import com.nyist.entity.Person;
import com.nyist.service.PersonService;
@Component
@RequestMapping("/delete.do")
public class PersonDelete {
@Autowired
private PersonService personService;
//依赖注入
@RequestMapping(params="method=deleteperson")
public String deleteperson(int id)
{
//deleteperson(int id) 在页面中直接获取ID ,Spring 自动为我们做这件事,但是 名字要保持一致
Person person = new Person();
person.setId(id);
personService.deletePerson(person);
//删除后进行重定向
return "redirect:personlist.do?method=personlist";
}
}
package com.nyist.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.nyist.entity.Person;
import com.nyist.service.PersonService;
@Controller
@RequestMapping("/personlist.do")
public class PersonList {
@Autowired
private PersonService personService;
//依赖注入
@RequestMapping(params="method=personlist")
public String personlist(HttpServletRequest request){
//调用Service的业务方法进行查询
List<Person> persons = personService.queryAllPerson();
HttpSession session = request.getSession();
//将查询到的数据存储的session中,然后进行跳转,在emplist中取出数据
session.setAttribute("persons", persons);
return "emplist";
}
}
package com.nyist.controller;
import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;
import com.nyist.entity.Person;
import com.nyist.service.PersonService;
//声明 控制器 ,并指定 访问路径
@Component
@RequestMapping("update.do")
public class PersonUpdate {
@Resource
private PersonService personService;
//指定函数 ,Controller 中的每个函数都要进行声明
@RequestMapping(params="method=updateperson")
public String updateperson(HttpServletRequest request) throws ParseException{
//在Controller中需要什么直接进行在形参上声明,然后SpringMVC自动为你创建,然后就可以直接使用了
//获取参数 ,id 等等,和增加的控制器不同,修改需要获取 id 属性然后才能就行修改
String id = request.getParameter("id");
int myid = Integer.parseInt(id);
String name = request.getParameter("name");
float salary = Float.parseFloat(request.getParameter("salary"));
//在插入的时候需要将日期进行转换
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//将 util 下的date 转成sql 下的date
Date birthday1 = new Date((sdf.parse(request.getParameter("birthday"))).getTime());
Person p = new Person();
p.setId(myid);
p.setName(name);
p.setSalary(salary);
p.setBirthday(birthday1);
personService.updatePerson(p);
//重定向到 person 列表 的controller中
return "redirect:personlist.do?method=personlist";
}
public PersonService getPersonService() {
return personService;
}
public void setPersonService(PersonService personService) {
this.personService = personService;
}
}
下面是最重要的配置文件的配置:
MybatisConfig.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>
<mappers>
<mapper resource="com/nyist/dao/mapper/ManageDaoMapper.xml"/>
<mapper resource="com/nyist/dao/mapper/PersonDaoMapper.xml"/>
</mappers>
</configuration>
ApplicationContext.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<context:component-scan base-package="com.nyist">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.url}"></property>
<property name="driverClass" value="${jdbc.driver}"></property>
<property name="user" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
<!-- 初始化获取三个连接,取值在minPoolSize 和maxPoolSize 之间 Default 为3 -->
<property name="initialPoolSize" value="3"></property>
<!-- 最小连接数 -->
<property name="minPoolSize" value="3"></property>
<!-- 连接池中保留的最大的连接数 -->
<property name="maxPoolSize" value="5"></property>
<!-- 当连接池中的连接耗尽的时候c3p0 一次同时获取的连接数 Default 为3 -->
<property name="acquireIncrement" value="3"></property>
<!-- 控制数据源内加载的PreparedStatements 数量,如果maxStatements 与maxStatementsPerConnection均 为0 的时候,则缓冲关闭,default =0 -->
<property name="maxStatements" value="8"></property>
<!--maxStatementsPerConnection定义了连接池内单个连接所拥有的最大缓存statements数。Default: 0 -->
<property name="maxStatementsPerConnection" value="5"></property>
<!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="1800"></property>
</bean>
<!-- SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 数据库的连接 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 加载Mybatis 的配置文件 -->
<property name="configLocation" value="classpath:mybaties/mybatisConfig.xml"></property>
</bean>
<!-- mapper扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.nyist.dao"></property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
</beans>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package = "com.nyist" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- 视图解析器 -->
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name = "suffix" value = ".jsp"/>
<!-- 使用jstl 进行数据交换 -->
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
</bean>
<mvc:annotation-driven></mvc:annotation-driven>
<mvc:default-servlet-handler/>
</beans>
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>SpringAndSpringMVCAndMybaties</display-name>
<!-- 加载mybaties 的配置文件 -->
<!-- <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath: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,classpath:spring/ApplicationContext.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 验证码 -->
<servlet>
<servlet-name>validationCodeServlet</servlet-name>
<servlet-class>com.nyist.util.ValidationCodeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>validationCodeServlet</servlet-name>
<url-pattern>/validationCodeServlet.png</url-pattern>
</servlet-mapping>
</web-app>
关于jsp 文件和css 和 其他 我会上传CSDN 下载中