系列文章目录
常用工具总结,可能不全,这是博主使用过得。如果有啥错误,请指教,不能直接复制粘贴使用,需要注意自己的命名等情况,核心代码是一样的。请勿喷。
文章目录
注意:项目所需jar包的地址,需要自取。
链接: https://pan.baidu.com/s/1KI_MAwtjpA7QjOshgKVFSA 提取码: p12c
一、Java的工具
1、通过传递的全包名路径,加载对应包下的所有类,变成存储字节码对象(class对象)的set集合的的工具类
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class PakegeToClassTools {
public static Set<Class<?>> getClasses(String pack) {
// 第一个class类的集合
Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
// 是否循环迭代
boolean recursive = true;
// 获取包的名字 并进行替换
String packageName = pack;
String packageDirName = packageName.replace('.', '/');
// 定义一个枚举的集合 并进行循环来处理这个目录下的things
Enumeration<URL> dirs;
try {
dirs = Thread.currentThread().getContextClassLoader().getResources(packageDirName);
// 循环迭代下去
while (dirs.hasMoreElements()) {
// 获取下一个元素
URL url = dirs.nextElement();
// 得到协议的名称
String protocol = url.getProtocol();
// 如果是以文件的形式保存在服务器上
if ("file".equals(protocol)) {
// 获取包的物理路径
String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
// 以文件的方式扫描整个包下的文件 并添加到集合中
findClassesInPackageByFile(packageName, filePath, recursive, classes);
} else if ("jar".equals(protocol)) {
// 如果是jar包文件
// 定义一个JarFile
System.out.println("jar类型的扫描");
JarFile jar;
try {
// 获取jar
jar = ((JarURLConnection) url.openConnection()).getJarFile();
// 从此jar包 得到一个枚举类
Enumeration<JarEntry> entries = jar.entries();
findClassesInPackageByJar(packageName, entries, packageDirName, recursive, classes);
} catch (IOException e) {
// log.error("在扫描用户定义视图时从jar包获取文件出错");
e.printStackTrace();
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes;
}
private static void findClassesInPackageByJar(String packageName, Enumeration<JarEntry> entries, String packageDirName, final boolean recursive, Set<Class<?>> classes) {
// 同样的进行循环迭代
while (entries.hasMoreElements()) {
// 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
JarEntry entry = entries.nextElement();
String name = entry.getName();
// 如果是以/开头的
if (name.charAt(0) == '/') {
// 获取后面的字符串
name = name.substring(1);
}
// 如果前半部分和定义的包名相同
if (name.startsWith(packageDirName)) {
int idx = name.lastIndexOf('/');
// 如果以"/"结尾 是一个包
if (idx != -1) {
// 获取包名 把"/"替换成"."
packageName = name.substring(0, idx).replace('/', '.');
}
// 如果可以迭代下去 并且是一个包
if ((idx != -1) || recursive) {
// 如果是一个.class文件 而且不是目录
if (name.endsWith(".class") && !entry.isDirectory()) {
// 去掉后面的".class" 获取真正的类名
String className = name.substring(packageName.length() + 1, name.length() - 6);
try {
// 添加到classes
classes.add(Class.forName(packageName + '.' + className));
} catch (ClassNotFoundException e) {
// .error("添加用户自定义视图类错误 找不到此类的.class文件");
e.printStackTrace();
}
}
}
}
}
}
private static void findClassesInPackageByFile(String packageName, String packagePath, final boolean recursive, Set<Class<?>> classes) {
// 获取此包的目录 建立一个File
File dir = new File(packagePath);
// 如果不存在或者 也不是目录就直接返回
if (!dir.exists() || !dir.isDirectory()) {
// log.warn("用户定义包名 " + packageName + " 下没有任何文件");
return;
}
// 如果存在 就获取包下的所有文件 包括目录
File[] dirfiles = dir.listFiles(new FileFilter() {
// 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
@Override
public boolean accept(File file) {
return (recursive && file.isDirectory()) || (file.getName().endsWith(".class"));
}
});
// 循环所有文件
for (File file : dirfiles) {
// 如果是目录 则继续扫描
if (file.isDirectory()) {
findClassesInPackageByFile(packageName + "." + file.getName(), file.getAbsolutePath(), recursive, classes);
} else {
// 如果是java类文件 去掉后面的.class 只留下类名
String className = file.getName().substring(0, file.getName().length() - 6);
try {
// 添加到集合中去
// classes.add(Class.forName(packageName + '.' +
// className));
// 经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净
classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
} catch (ClassNotFoundException e) {
// log.error("添加用户自定义视图类错误 找不到此类的.class文件");
e.printStackTrace();
}
}
}
}
}
二、JavaWeb的工具
1、验证码的生成至页面
-
验证码工具类
/** 需要导入 commons-io-1.4.jar io传入包 下载地址: */ public class VerifyCode { //验证码的宽度 private int w = 70; //验证码的高度 private int h = 35; private Random r = new Random(); //随机字体 private String[] fontNames = {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}; //随机字符 private String codes = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //背景颜色 private Color bgColor = new Color(240, 240, 240); //记录生成的验证码字符 private String text ; /* 生成随机颜色 */ private Color randomColor () { int red = r.nextInt(256); int green = r.nextInt(256); int blue = r.nextInt(256); return new Color(red, green, blue); } /* 生成随机字体 */ private Font randomFont () { int index = r.nextInt(fontNames.length); String fontName = fontNames[index]; int style = r.nextInt(4); int size = r.nextInt(5) + 24; return new Font(fontName, style, size); } /* 生成随机的干扰线条 */ private void drawLine (BufferedImage image) { int num = 5; Graphics2D g2 = (Graphics2D)image.getGraphics(); for(int i = 0; i < num; i++) { int x1 = r.nextInt(w); int y1 = r.nextInt(h); int x2 = r.nextInt(w); int y2 = r.nextInt(h); g2.setStroke(new BasicStroke(1.5F)); g2.setColor(Color.BLUE); g2.drawLine(x1, y1, x2, y2); } } /* 生成随机的字符 */ private char randomChar () { int index = r.nextInt(codes.length()); return codes.charAt(index); } /* 创建图片 但未生成验证码 */ private BufferedImage createImage () { BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Graphics2D g2 = (Graphics2D)image.getGraphics(); g2.setColor(this.bgColor); g2.fillRect(0, 0, w, h); return image; } /* 创建图片 写入验证码 */ public BufferedImage getImage () { BufferedImage image = createImage(); Graphics2D g2 = (Graphics2D)image.getGraphics(); StringBuilder sb = new StringBuilder(); // 向图片中画4个字符 for(int i = 0; i < 4; i++) { //产生随机字符 String s = randomChar() + ""; sb.append(s); float x = i * 1.0F * w / 4; //设置字体 g2.setFont(randomFont()); //设置字体颜色 g2.setColor(randomColor()); //设置字符的位置 g2.drawString(s, x, h); } //存储验证码的字符 this.text = sb.toString(); //画干扰线条 drawLine(image); return image; } /* 获取验证码的上的字符 */ public String getText () { return text; } /* 生成验证码到输出流中 */ public static void output (BufferedImage image, OutputStream out) throws IOException { ImageIO.write(image, "JPEG", out); } }
-
将验证码响应给前台页面的servlet
//如果未是使用注解 需要配置 web.xml @WebServlet("/verifyCodeServlet") public class VerifyCodeServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream outputStream = response.getOutputStream(); VerifyCode verifyCode = new VerifyCode(); //获取验证码图片 BufferedImage image = verifyCode.getImage(); //存储到session域中,用户登陆或注册时的验证 request.getSession().setAttribute("verifyCodeText",verifyCode.getText()); //以流的方式响应给浏览器 VerifyCode.output(image,outputStream); } }
web.xml配置如下:(servlet-class中的得换成自己的包名)
<servlet> <servlet-name>verifyCodeServlet</servlet-name> <servlet-class>com.shopping.servlet.VerifyCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>verifyCodeServlet</servlet-name> <url-pattern>/verifyCodeServlet</url-pattern> </servlet-mapping>
-
前台刷新接收代码
<a href="javascript:exchangeVerifyCode();" id="hrefVerifyCode1"> <img src="${pageContext.request.contextPath}/verifyCodeServlet" id="verifyCode"> </a> <script type="text/javascript"> /*使用的是jq的方式 更改验证码 后面跟参数的原因是:动态改变参数值,防止缓存的存在,避免刷新不了验证码*/ function exchangeVerifyCode() { $("#verifyCode").attr('src', "${pageContext.request.contextPath}/verifyCodeServlet?yyy=" + new Date().getTime()); } </<script>
-
效果如下:
2、省级联动
-
前提注意:该功能,只写入了前端传递更改的代码,后台数据库如何查询未写出(数据库设计不同或者有的用xml文件等表示地址),且返回的字符必须为json能使用。城市下拉框的内容会在进入页面时,就已经显示完成,需要提前查找处来(Java web的处理方式,写一个拦截器拦截当前页面,查询出城市,渲染到页面上即可)
-
jsp代码(只写入关键代码,得导入 jstl.jar,使用jstl表达式)
<!--引入jstl标签--> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <div class="addr_item"> <span class="label_n"><span class="c_red">*</span>所在地区:</span> <select class="city" name="province" id="province"> <option value="0">请选择省份</option> <%--刚进这个页面时,需要显示所有的省份城市--%> <c:forEach items="${provinces}" var="province"> <option value="${province.id}">${province.cityName}</option> </c:forEach> </select> <select class="city" name="city" id="city"> <option value="0">请选择城市</option> </select> <select class="city" name="county" id="county"> <option value="0">请选择区县</option> </select> <div class="addr_msg"> <span id="error_statename"></span> </div> </div> <!--引入jq--> <script src="js/jquery-1.8.3.js" type="text/javascript" charset="utf-8"></script> <script> //选中的省改变触发这个函数 改变城市的选项 $("select[name='province']").change( function () { //获取选中的 城市的下拉框的值 var provinceId = $("#province").val(); //发送ajax请求 $.ajax({ //请求方式 type: "post", //请求路径 该路径返回json串 渲染到页面上 url: "${pageContext.request.contextPath}/cityChangeServlet", //告诉浏览器返回的是json串 dataType: "json", //传递过去的参数为 省份的id 可根据省份的id查找对应的城市 data: { "provinceId": provinceId }, //请求成功处理的函数 data为返回的数据 也就是json串 success: function (data) { //首先清除掉城市下拉框和区县下拉框下的内容,保留第一个(防止城市区县一直叠加,如果不清除,选择一个省份后,在选另一个省份,会进行叠加,导致错误选项出现) $("#city").find("option").not(":first").remove(); $("#county").find("option").not(":first").remove(); //循环遍历数据 渲染到城市的下拉框上 $.each(data, function (name, value) { $("#city").append( "<option value=" + value.id + ">" + value.cityName + "</option>"); }); } }); }); //选中的城市改变触发这个函数 改变区县的选项 $("select[name='city']") .change( function () { var cityId = $("#city").val(); $.ajax({ type: "post", url: "${pageContext.request.contextPath}/countyChangeServlet", dataType: "json", //传递过去的参数为 城市的id 可根据城市的id查找对应的县区 data: { "cityId": cityId }, success: function (data) { //首先清除掉区县下拉框下的内容,保留第一个(防止区县一直叠加,如果不清除,选择一个城市后,在选另一个城市,会进行叠加,导致错误选项出现) $("#county").find("option").not(":first").remove(); //循环遍历数据 渲染到城市的下拉框上 $.each(data, function (name, value) { $("#county").append( "<option value=" + value.id + ">" + value.cityName + "</option>"); }); } }); }); </script>
-
效果
3、将一个map转成一个bean对象。
-
需要导入commons-beanutils-1.9.2.jar包。
-
代码如下:
/** * 将map转成实体类对象,要求:map封装的key 与 实体类的属性名必须一致 * @param clasz 需要转成的对象class * @param map 存储的键值对 * @param <T> 转成的对象 * @return 返回bean对象 */ public class BeanUtilsDemo { public static <T> T beanMap(Class<T> clasz , Map map){ T bean = null; try { bean = clasz.newInstance(); BeanUtils.populate(bean,map); return bean; } catch (Exception e) { e.printStackTrace(); } return bean; } }
-
测试代码,以Address实体类为例。
<form id="address_from" method="post"> <div class="new_addr"> <div class="addr_item"> <span class="label_n"><span class="c_red">*</span>收货人:</span> <input class="itxt" name="name" id="name" type="text"> </div> <div class="addr_item"> <div class="addr_item"> <span class="label_n"><span class="c_red">*</span>所在地区:</span> <select class="city" name="province" id="province"> <option value="0">请选择省份</option> <c:forEach items="${provinces}" var="province"> <option value="${province.id}">${province.cityName}</option> </c:forEach> </select> <select class="city" name="city" id="city"> <option value="0">请选择城市</option> </select> <select class="city" name="county" id="county"> <option value="0">请选择区县</option> </select> </div> <span class="label_n"><span class="c_red">*</span>详细地址:</span> <input placeholder="详细地址" name="address" class="itxt itxtaddr" id="address" type="text"> </div> <div class="addr_item"> <span class="label_n"><span class="c_red">*</span>手机号码:</span> <input placeholder="手机号码" name="telphone" class="itxt itxt_tel" id="telphone" type="text"> </div> <div class="addr_item btn_item"> <input type="submit" class="btn_addaddr" id="addresssubmit" value="添加"> </div> </div> </form>
//获取前端提交(post提交)的所有参数,封装成map,key为输入框的name属性的值,value为自己输入的值。 Map<String, String[]> map = request.getParameterMap(); //将封装的map对象转成bean对象。 Address address = BeanUtilsDemo.beanMap(Address.class, map);
public class Address { private String id; private String name; private String address; private String telphone; private User user; ...get()、set()、tosSring()等方法 }
-
效果如下:
4、邮件的发送。
-
导入mail.jar包。
-
工具类代码。
public class SendEmail { /** * 发送邮件 * @param email 收件人的邮箱 * @param request */ public static void sendEmail(String email, HttpServletRequest request){ //设置发送端的地址和密码 String host ="自己的邮箱"; //(一般需要登陆邮箱后,生成一个密文密码,各个邮箱生成不同,可自行查找) String password= "密码"; //创建Properties 集合 Properties properties = new Properties(); //设置服务器主机名 properties.setProperty("mail.host","smtp.qq.com"); //设置需要验证 properties.setProperty("mail.smtp.auth","true"); //校验客户端的身份 Authenticator auth = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { //发件人 密码 return new PasswordAuthentication(host,password); } }; //获取邮箱session会话 Session session = Session.getDefaultInstance(properties, auth); //创建MimeMessage对象 MimeMessage msg = new MimeMessage(session); //设置发信人地址、收信人地址、主题以及邮件正文 try { //设置发信人 msg.setFrom(new InternetAddress(host)); //设置收信人 msg.addRecipients(Message.RecipientType.TO,email); //设置抄送 msg.addRecipients(Message.RecipientType.CC,host); //设置单个暗关 msg.addRecipients(Message.RecipientType.BCC,host); //设置主题 自己设置 msg.setSubject("书城管理注册激活邮件"); //设置正文 自己写自己的正文内容 msg.setContent("点击激活,即可注册完毕,<a href=http://localhost:8080"+request.getContextPath()+"/activateServlet>激活</a>,请在30分钟内点击,否则无法激活!!","text/html;charset=utf-8"); Transport.send(msg); //发送邮件 } catch (MessagingException e) { e.printStackTrace(); } } }
-
测试代码。
//获取前端传递的参数 String email = request.getParameter("email"); //发送邮件 SendEmail.sendEmail(email,request);
-
效果图
5、获取C3P0数据源的工具类。
- 导入c3p0-0.9.1.2.jar、commons-collections-3.2.2.jar包。
- C3P0Utils 工具类代码。
public class C3P0Utils { //创建数据源 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); /* 获取数据源的连接 */ public static Connection getConnection() { try { return dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } /* 获取数据源 */ public static DataSource getDataSource() { return dataSource; } /* 关闭资源(用于更新、删除、插入操作时) */ public static void close(Connection con , Statement st ) { if(st != null) { try { st.close() ; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con != null) { try { con.close() ; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /* 关闭资源(用于查找操作时) */ public static void close(Connection con , Statement st , ResultSet rs) { if (rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(st != null) { try { st.close() ; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(con != null) { try { con.close() ; } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
二、js的工具
1.validate.js 各种输入框的验证工具
- 前提:HTML 必须先引入jquery。如:
<script src="js/jquery-2.1.1.min.js"></script> <script src="js/jquery.validate.min.js"></script>
- 以表单提交为例。
<form id="register_form" method="post"> <div class="item"> <input placeholder="请输入用户名" class="itxt" name="username" id="username" type="text"> </div> <div class="item item2"> <input placeholder="请输入密码" class="itxt" name="password" id="password" type="password"> </div> <div class="item item2"> <input placeholder="确认密码" class="itxt" name="truePassword" id="truePassword" type="password"> </div> <div class="item item2"> <input class="itxt" username="sex" id="sex" type="radio" value="0" style="width: 20px;">男 <input class="itxt" username="sex" id="sex2" type="radio" value="1" style="width: 20px;">女 </div> <div class="item"> <input placeholder="请输入手机号码" class="itxt" name="telephone" id="telephone" type="text"> </div> <div class="item"> <input placeholder="请输入邮箱" class="itxt" name="email" id="email" type="text"> </div> <div class="item items"> <div style="display: block" id="verify"> <input id="verifyCodeText" name="verifyCodeText" class="itxt itxt_yzm onfocustxt" username="mobile_code" id="mobile_code" type="text"> <a href="javascript:exchangeVerifyCode();" id="hrefVerifyCode1" style="margin-left: 18px;"> <img src="${pageContext.request.contextPath}/verifyCodeServlet" id="verifyCode"> </a> </div> <div class="err_box"> <div class="err_msg2 msg" style="display: none;" id="errorMsg"></div> </div> </div> <div class="item item5"> <div class="login-btn"> <input type="submit" id="registersubmit" value="立即注册"> </div> <div class="agree"> <input class="jdcheckbox" tabindex="8" name="agree" id="agree" type="checkbox"> <label>同意快乐购<span><a href="" target="_blank">《用户服务协议》</a></span>条款</label> </div> </div> </form> <script src="js/jquery-2.1.1.min.js"></script> <script src="js/jquery.validate.min.js"></script> <script type="text/javascript"> // 单击验证码刷新 具体代码可见 验证码的生成至页面 章节 function exchangeVerifyCode() { $("#verifyCode").attr('src', "${pageContext.request.contextPath}/verifyCodeServlet?yyy=" + new Date().getTime()); } //添加自定义的验证方式 // 第一个参数: isMobile为验证的名称 第二个参数: function ()处理方式 第三个参数:提示消息 $.validator.addMethod("isMobile", function (value, element) { var length = value.length; var mobile = /^(13[0-9]{9})|(18[0-9]{9})|(14[0-9]{9})|(17[0-9]{9})|(15[0-9]{9})$/; return this.optional(element) || (length == 11 && mobile.test(value)); }, "请正确填写您的手机号码"); $(function () { //表单验证实现方式 $("#register_form").validate({ //验证 如果改验证码出错 则会显示下面message对象中对应的消息 rules: { //验证输入框id为username 的输入框 username: { //验证输入必须存在 required: true, //验证输入最小长度 minlength: 2, //验证输入最大长度 maxlength: 6, //发送ajax异步请求 验证用户名是否存在 remote: { //请求方式 type: "post", //ajax请求的路径 url: "${pageContext.request.contextPath}/judgeServlet", data: { //传送的参数 username: $("#username").value } }/* ajax调用后台功能*/ }, //验证输入框id为password的输入框 password: { required: true, //验证输入长度在 6 - 20 之间 rangelength: [6, 20] }, //验证输入框id为truePassword的输入框 truePassword: { // 验证输入 与id为password输入框的值相同 equalTo: "#password" }, //验证输入框id为email的输入框 email: { required: true, // 验证输入 与是否是邮件的格式 email: true, //发送ajax异步请求 验证邮箱是否存在 remote: { type: "post", //请求的方式 url: "${pageContext.request.contextPath}/judgeServlet", // 请求的url路径 data: { //传递的参数 email: $("#email").value } }/* ajax调用后台功能*/ }, //验证输入框id为telephone的输入框 telephone: { required: true, //验证输入是否是纯数字 number: true, //使用自定义的验证方式 判断是否是正确的手机号码 isMobile: true, rangelength: [11, 11] }, //验证输入框id为verifyCodeText的输入框 verifyCodeText: { required: true, rangelength: [4, 4], //发送ajax异步请求 验证验证码是否正确 remote: { type: "post", //请求的方式 url: "${pageContext.request.contextPath}/judgeServlet", // 请求的url路径 data: { //传递的参数 verifyCodeText: $("#verifyCodeText").value } }/* ajax调用后台功能*/ }, sex: {required: true} }, //验证未成功的提示消息 如果某项未成功对应的某项就会显示错误消息。如: username输入框未输入,则会显示 username输入框对应的required的提示消息 messages: { username: { required: "用户名必填", minlength: "用户名至少2位", maxlength: "用户名不能超过6位", remote: "用户已存在" }, password: { required: "密码必填", digits: "密码必须是整数", rangelength: "密码6位到20位" }, truePassword: { equalTo: "两次密码不一致" }, email: { required: "邮箱必填", email: "邮箱格式错误", remote: "邮箱已存在" }, telephone: { required: "手机号码必填", number: "必须为数字", rangelength: "手机号码长度为11位", isMobile: "请输入正确的手机格式" }, verifyCodeText: { required: "验证码必填", rangelength: "验证码长度为4位", remote: "验证码错误" }, sex: { required: "请选择性别" } }, }); }); </script>
- 效果如下
三、SSM的工具
1、SSM项目的搭建。
- 创建web项目。
<!--字符编码过滤器--> <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> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--REST过滤器--> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--实例化spring容器的监听器--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!--springmvc前段控制器--> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/dispatcher-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>