常用工具总结,可能不全,这是博主使用过得。如果有啥错误,请指教,不能直接复制粘贴使用,需要注意自己的命名等情况,核心代码是一样的。请勿喷。
链接: https://pan.baidu.com/s/1KI_MAwtjpA7QjOshgKVFSA 提取码: p12c
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();
}
}
}
}
}
验证码工具类
/**
需要导入 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>verifyCodeServletservlet-name>
<servlet-class>com.shopping.servlet.VerifyCodeServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>verifyCodeServletservlet-name>
<url-pattern>/verifyCodeServleturl-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>
前提注意:该功能,只写入了前端传递更改的代码,后台数据库如何查询未写出(数据库设计不同或者有的用xml文件等表示地址),且返回的字符必须为json能使用。城市下拉框的内容会在进入页面时,就已经显示完成,需要提前查找处来(Java web的处理方式,写一个拦截器拦截当前页面,查询出城市,渲染到页面上即可)
jsp代码(只写入关键代码,得导入 jstl.jar,使用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>
<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(
" value.id + ">" + value.cityName + "");
});
}
});
});
//选中的城市改变触发这个函数 改变区县的选项
$("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(
" value.id + ">" + value.cityName + "");
});
}
});
});
script>
需要导入commons-beanutils-1.9.2.jar包。
代码如下:
/**
* 将map转成实体类对象,要求:map封装的key 与 实体类的属性名必须一致
* @param clasz 需要转成的对象class
* @param map 存储的键值对
* @param 转成的对象
* @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()等方法
}
导入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("点击激活,即可注册完毕,+request.getContextPath()+"/activateServlet>激活,请在30分钟内点击,否则无法激活!!","text/html;charset=utf-8");
Transport.send(msg); //发送邮件
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
测试代码。
//获取前端传递的参数
String email = request.getParameter("email");
//发送邮件
SendEmail.sendEmail(email,request);
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();
}
}
}
}
<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>
<filter>
<filter-name>CharacterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>UTF-8param-value>
init-param>
filter>
<filter-mapping>
<filter-name>CharacterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<filter>
<filter-name>HiddenHttpMethodFilterfilter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilterfilter-class>
filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
<context-param>
<param-name>contextConfigLocationparam-name>
<param-value>/WEB-INF/applicationContext.xmlparam-value>
context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
listener>
<servlet>
<servlet-name>dispatcherservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>/WEB-INF/dispatcher-servlet.xmlparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>dispatcherservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>