1. Load db3.properties

  1. String path = this.getServletContext().getRealPath("/WEB-INF/classes/db/config/db3.properties");
  2. InputStream in = new FileInputStream(path);
  3. Properties prop = new Properties();
  4. prop.load(in);

2. Load db4.properties

  1. InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/gacl/servlet/study/db4.properties");
  2. Properties prop = new Properties();
  3. prop.load(in);
  1. ClassLoader loader = ServletContextDemo.class.getClassLoader();
  2. InputStream in = loader.getResourceAsStream("gacl/servlet/study/db4.properties");
  3. Properties prop = new Properties();
  4. prop.load(in);

3. Load db2.properties

  1. InputStream in = this.getServletContext().getResourceAsStream("/db2.properties");
  2. Properties prop = new Properties();
  3. prop.load(in);

4. Load db1.properties

  1. InputStream in = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db1.properties");
  2. Properties prop = new Properties();
  3. prop.load(in);
  1. ClassLoader loader = ServletContextDemo.class.getClassLoader();
  2. InputStream in = loader.getResourceAsStream("db1.properties");
  3. Properties prop = new Properties();
  4. prop.load(in);

在客户端缓存Servlet的输出:

  1. response.setDateHeader("expires",System.currentTimeMillis() + 24 * 3600 * 1000);
  2. response.getOutputStream().write(data.getBytes());

多个Servlet通过ServletContext对象实现数据共享

  1. ServletContext context = this.getServletConfig().getServletContext();
  2. context.setAttribute("data", data);
  1. ServletContext context = this.getServletContext();
  2. String data = (String) context.getAttribute("data");

在web.xml文件中使用<context-param>标签配置WEB应用的初始化参数

  1. <context-param>
  2. <param-name>url</param-name>
  3. <param-value>jdbc:mysql://localhost:3306/test</param-value>
  4. </context-param>
  1. ServletContext context = this.getServletContext();
  2. String contextInitParam = context.getInitParameter("url");

用servletContext实现请求转发

  1. ServletContext context = this.getServletContext();
  2. RequestDispatcher rd = context.getRequestDispatcher("/servlet/ServletContextDemo5");
  3. rd.forward(request, response);

Servlet 3.0 with annotation of @WebServlet @WebInitParam and use reflection

  1. <filter>
  2. <description>注解处理过滤器</description>
  3. <filter-name>AnnotationHandleFilter</filter-name>
  4. <filter-class>me.gacl.web.filter.AnnotationHandleFilter</filter-class>
  5. <init-param>
  6. <description>配置要扫描包及其子包, 如果有多个包,以逗号分隔</description>
  7. <param-name>basePackage</param-name>
  8. <param-value>me.gacl.web.controller,me.gacl.web.UI</param-value>
  9. <!-- <param-value>me.gacl.web.controller</param-value> -->
  10. </init-param>
  11. </filter>
  12.  
  13. <filter-mapping>
  14. <filter-name>AnnotationHandleFilter</filter-name>
  15. <!-- 拦截后缀是.do的请求 -->
  16. <url-pattern>*.do</url-pattern>
  17. </filter-mapping>
  1. package me.gacl.web.filter;
  2.  
  3. import java.io.IOException;
  4. import java.lang.reflect.InvocationTargetException;
  5. import java.lang.reflect.Method;
  6. import java.lang.reflect.Modifier;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import java.util.Set;
  10. import javax.servlet.Filter;
  11. import javax.servlet.FilterChain;
  12. import javax.servlet.FilterConfig;
  13. import javax.servlet.ServletContext;
  14. import javax.servlet.ServletException;
  15. import javax.servlet.ServletRequest;
  16. import javax.servlet.ServletResponse;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. import me.gacl.annotation.WebInitParam;
  20. import me.gacl.annotation.WebServlet;
  21. import me.gacl.util.ScanClassUtil;
  22.  
  23. /**
  24. * @ClassName: AnnotationHandleFilter
  25. * @Description: 使用Filter作为注解的处理器
  26. * @author: 孤傲苍狼
  27. * @date: 2014-11-12 下午10:15:19
  28. *
  29. */
  30. public class AnnotationHandleFilter implements Filter {
  31.  
  32. private ServletContext servletContext = null;
  33.  
  34. /* 过滤器初始化时扫描指定的包下面使用了WebServlet注解的那些类
  35. * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
  36. */
  37. public void init(FilterConfig filterConfig) throws ServletException {
  38. System.out.println("---AnnotationHandleFilter过滤器初始化开始---");
  39. servletContext = filterConfig.getServletContext();
  40. Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
  41. //获取web.xml中配置的要扫描的包
  42. String basePackage = filterConfig.getInitParameter("basePackage");
  43. //如果配置了多个包,例如:<param-value>me.gacl.web.controller,me.gacl.web.UI</param-value>
  44. if (basePackage.indexOf(",")>0) {
  45. //按逗号进行分隔
  46. String[] packageNameArr = basePackage.split(",");
  47. for (String packageName : packageNameArr) {
  48. addServletClassToServletContext(packageName,classMap);
  49. }
  50. }else {
  51. addServletClassToServletContext(basePackage,classMap);
  52. }
  53. System.out.println("----AnnotationHandleFilter过滤器初始化结束---");
  54. }
  55.  
  56. /**
  57. * @Method: addServletClassToServletContext
  58. * @Description:添加ServletClass到ServletContext中
  59. * @Anthor:孤傲苍狼
  60. *
  61. * @param packageName
  62. * @param classMap
  63. */
  64. private void addServletClassToServletContext(String packageName,Map<String, Class<?>> classMap){
  65. Set<Class<?>> setClasses = ScanClassUtil.getClasses(packageName);
  66. for (Class<?> clazz :setClasses) {
  67. if (clazz.isAnnotationPresent(WebServlet.class)) {
  68. //获取WebServlet这个Annotation的实例
  69. WebServlet annotationInstance = clazz.getAnnotation(WebServlet.class);
  70. //获取Annotation的实例的value属性的值
  71. String annotationAttrValue = annotationInstance.value();
  72. if (!annotationAttrValue.equals("")) {
  73. classMap.put(annotationAttrValue, clazz);
  74. }
  75. //获取Annotation的实例的urlPatterns属性的值
  76. String[] urlPatterns = annotationInstance.urlPatterns();
  77. for (String urlPattern : urlPatterns) {
  78. classMap.put(urlPattern, clazz);
  79. }
  80. servletContext.setAttribute("servletClassMap", classMap);
  81. System.out.println("annotationAttrValue:"+annotationAttrValue);
  82. String targetClassName = annotationAttrValue.substring(annotationAttrValue.lastIndexOf("/")+1);
  83. System.out.println("targetClassName:"+targetClassName);
  84. System.out.println(clazz);
  85. }
  86. }
  87. }
  88.  
  89. public void doFilter(ServletRequest request, ServletResponse response,
  90. FilterChain chain) throws IOException, ServletException {
  91. System.out.println("---进入注解处理过滤器---");
  92. //将ServletRequest强制转换成HttpServletRequest
  93. HttpServletRequest req = (HttpServletRequest)request;
  94. HttpServletResponse res = (HttpServletResponse)response;
  95. Map<String, Class<?>> classMap = (Map<String, Class<?>>) servletContext.getAttribute("servletClassMap");
  96. //获取contextPath
  97. String contextPath = req.getContextPath();
  98. //获取用户请求的URI资源
  99. String uri = req.getRequestURI();
  100. //如果没有指明要调用Servlet类中的哪个方法
  101. if (uri.indexOf("!")==-1) {
  102. //获取用户使用的请求方式
  103. String reqMethod = req.getMethod();
  104. //获取要请求的servlet路径
  105. String requestServletName = uri.substring(contextPath.length(),uri.lastIndexOf("."));
  106. //获取要使用的类
  107. Class<?> clazz = classMap.get(requestServletName);
  108. //创建类的实例
  109. Object obj = null;
  110. try {
  111. obj = clazz.newInstance();
  112. } catch (InstantiationException e1) {
  113. e1.printStackTrace();
  114. } catch (IllegalAccessException e1) {
  115. e1.printStackTrace();
  116. }
  117. Method targetMethod = null;
  118. if (reqMethod.equalsIgnoreCase("get")) {
  119. try {
  120. targetMethod = clazz.getDeclaredMethod("doGet",HttpServletRequest.class,HttpServletResponse.class);
  121. } catch (SecurityException e) {
  122. e.printStackTrace();
  123. } catch (NoSuchMethodException e) {
  124. e.printStackTrace();
  125. }
  126. }else {
  127. try {
  128. targetMethod = clazz.getDeclaredMethod("doPost",HttpServletRequest.class,HttpServletResponse.class);
  129. } catch (SecurityException e) {
  130. e.printStackTrace();
  131. } catch (NoSuchMethodException e) {
  132. e.printStackTrace();
  133. }
  134. }
  135.  
  136. try {
  137. //调用对象的方法进行处理
  138. targetMethod.invoke(obj,req,res);
  139. } catch (IllegalArgumentException e) {
  140. e.printStackTrace();
  141. } catch (IllegalAccessException e) {
  142. e.printStackTrace();
  143. } catch (InvocationTargetException e) {
  144. e.printStackTrace();
  145. }
  146. }else {
  147. //获取要请求的servlet路径
  148. String requestServletName = uri.substring(contextPath.length(),uri.lastIndexOf("!"));
  149. //获取要调用的servlet的方法
  150. String invokeMethodName = uri.substring(uri.lastIndexOf("!")+1,uri.lastIndexOf("."));
  151.  
  152. //获取要使用的类
  153. Class<?> clazz = classMap.get(requestServletName);
  154. //创建类的实例
  155. Object obj = null;
  156. try {
  157. obj = clazz.newInstance();
  158. } catch (InstantiationException e1) {
  159. e1.printStackTrace();
  160. } catch (IllegalAccessException e1) {
  161. e1.printStackTrace();
  162. }
  163. //获得clazz类定义的所有方法
  164. Method[] methods = clazz.getDeclaredMethods();
  165. //获取WebServlet这个Annotation的实例
  166. WebServlet annotationInstance = clazz.getAnnotation(WebServlet.class);
  167. //获取注解上配置的初始化参数数组
  168. WebInitParam[] initParamArr = annotationInstance.initParams();
  169. Map<String, String> initParamMap = new HashMap<String, String>();
  170. for (WebInitParam initParam : initParamArr) {
  171. initParamMap.put(initParam.paramName(), initParam.paramValue());
  172. }
  173. //遍历clazz类中的方法
  174. for (Method method : methods) {
  175. //该方法的返回类型
  176. Class<?> retType = method.getReturnType();
  177. //获得方法名
  178. String methodName = method.getName();
  179. //打印方法修饰符
  180. System.out.print(Modifier.toString(method.getModifiers()));
  181. System.out.print(" "+retType.getName() + " " + methodName +"(");
  182. //获得一个方法参数数组(getparameterTypes用于返回一个描述参数类型的Class对象数组)
  183. Class<?>[] paramTypes = method.getParameterTypes();
  184. for(int j = 0 ; j < paramTypes.length ; j++){
  185. //如果有多个参数,中间则用逗号隔开,否则直接打印参数
  186. if (j > 0){
  187. System.out.print(",");
  188. }
  189. System.out.print(paramTypes[j].getName());
  190. }
  191. System.out.println(");");
  192. if (method.getName().equalsIgnoreCase("init")) {
  193. try {
  194. //调用Servlet的初始化方法
  195. method.invoke(obj, initParamMap);
  196. } catch (IllegalArgumentException e) {
  197. e.printStackTrace();
  198. } catch (IllegalAccessException e) {
  199. e.printStackTrace();
  200. } catch (InvocationTargetException e) {
  201. e.printStackTrace();
  202. }
  203. }
  204. }
  205. //获取WebServlet这个Annotation的实例
  206. System.out.println("invokeMethodName:"+invokeMethodName);
  207. try {
  208. try {
  209. //利用反射获取方法实例,方法的签名必须符合:
  210. //public void 方法名(HttpServletRequest request, HttpServletResponse response)
  211. //例如:public void loginHandle(HttpServletRequest request, HttpServletResponse response)
  212. Method targetMethod = clazz.getDeclaredMethod(invokeMethodName,HttpServletRequest.class,HttpServletResponse.class);
  213. //调用对象的方法进行处理
  214. targetMethod.invoke(obj,req,res);
  215. } catch (SecurityException e) {
  216. e.printStackTrace();
  217. } catch (NoSuchMethodException e) {
  218. e.printStackTrace();
  219. } catch (IllegalArgumentException e) {
  220. e.printStackTrace();
  221. } catch (InvocationTargetException e) {
  222. e.printStackTrace();
  223. }
  224. } catch (IllegalAccessException e) {
  225. e.printStackTrace();
  226. }
  227. }
  228. }
  229.  
  230. public void destroy() {
  231.  
  232. }
  233. }
  1. package me.gacl.util;
  2.  
  3. import java.io.File;
  4. import java.io.FileFilter;
  5. import java.io.IOException;
  6. import java.net.JarURLConnection;
  7. import java.net.URL;
  8. import java.net.URLDecoder;
  9. import java.util.Enumeration;
  10. import java.util.LinkedHashSet;
  11. import java.util.Set;
  12. import java.util.jar.JarEntry;
  13. import java.util.jar.JarFile;
  14.  
  15. public class ScanClassUtil {
  16.  
  17. /**
  18. * 从包package中获取所有的Class
  19. *
  20. * @param pack
  21. * @return
  22. */
  23. public static Set<Class<?>> getClasses(String pack) {
  24.  
  25. // 第一个class类的集合
  26. Set<Class<?>> classes = new LinkedHashSet<Class<?>>();
  27. // 是否循环迭代
  28. boolean recursive = true;
  29. // 获取包的名字 并进行替换
  30. String packageName = pack;
  31. String packageDirName = packageName.replace('.', '/');
  32. // 定义一个枚举的集合 并进行循环来处理这个目录下的things
  33. Enumeration<URL> dirs;
  34. try {
  35. dirs = Thread.currentThread().getContextClassLoader().getResources(
  36. packageDirName);
  37. // 循环迭代下去
  38. while (dirs.hasMoreElements()) {
  39. // 获取下一个元素
  40. URL url = dirs.nextElement();
  41. // 得到协议的名称
  42. String protocol = url.getProtocol();
  43. // 如果是以文件的形式保存在服务器上
  44. if ("file".equals(protocol)) {
  45. System.err.println("file类型的扫描");
  46. // 获取包的物理路径
  47. String filePath = URLDecoder.decode(url.getFile(), "UTF-8");
  48. // 以文件的方式扫描整个包下的文件 并添加到集合中
  49. findAndAddClassesInPackageByFile(packageName, filePath,
  50. recursive, classes);
  51. } else if ("jar".equals(protocol)) {
  52. // 如果是jar包文件
  53. // 定义一个JarFile
  54. System.err.println("jar类型的扫描");
  55. JarFile jar;
  56. try {
  57. // 获取jar
  58. jar = ((JarURLConnection) url.openConnection())
  59. .getJarFile();
  60. // 从此jar包 得到一个枚举类
  61. Enumeration<JarEntry> entries = jar.entries();
  62. // 同样的进行循环迭代
  63. while (entries.hasMoreElements()) {
  64. // 获取jar里的一个实体 可以是目录 和一些jar包里的其他文件 如META-INF等文件
  65. JarEntry entry = entries.nextElement();
  66. String name = entry.getName();
  67. // 如果是以/开头的
  68. if (name.charAt(0) == '/') {
  69. // 获取后面的字符串
  70. name = name.substring(1);
  71. }
  72. // 如果前半部分和定义的包名相同
  73. if (name.startsWith(packageDirName)) {
  74. int idx = name.lastIndexOf('/');
  75. // 如果以"/"结尾 是一个包
  76. if (idx != -1) {
  77. // 获取包名 把"/"替换成"."
  78. packageName = name.substring(0, idx)
  79. .replace('/', '.');
  80. }
  81. // 如果可以迭代下去 并且是一个包
  82. if ((idx != -1) || recursive) {
  83. // 如果是一个.class文件 而且不是目录
  84. if (name.endsWith(".class")
  85. && !entry.isDirectory()) {
  86. // 去掉后面的".class" 获取真正的类名
  87. String className = name.substring(
  88. packageName.length() + 1, name
  89. .length() - 6);
  90. try {
  91. // 添加到classes
  92. classes.add(Class
  93. .forName(packageName + '.'
  94. + className));
  95. } catch (ClassNotFoundException e) {
  96. // log
  97. // .error("添加用户自定义视图类错误 找不到此类的.class文件");
  98. e.printStackTrace();
  99. }
  100. }
  101. }
  102. }
  103. }
  104. } catch (IOException e) {
  105. // log.error("在扫描用户定义视图时从jar包获取文件出错");
  106. e.printStackTrace();
  107. }
  108. }
  109. }
  110. } catch (IOException e) {
  111. e.printStackTrace();
  112. }
  113.  
  114. return classes;
  115. }
  116.  
  117. /**
  118. * 以文件的形式来获取包下的所有Class
  119. *
  120. * @param packageName
  121. * @param packagePath
  122. * @param recursive
  123. * @param classes
  124. */
  125. public static void findAndAddClassesInPackageByFile(String packageName,
  126. String packagePath, final boolean recursive, Set<Class<?>> classes) {
  127. // 获取此包的目录 建立一个File
  128. File dir = new File(packagePath);
  129. // 如果不存在或者 也不是目录就直接返回
  130. if (!dir.exists() || !dir.isDirectory()) {
  131. // log.warn("用户定义包名 " + packageName + " 下没有任何文件");
  132. return;
  133. }
  134. // 如果存在 就获取包下的所有文件 包括目录
  135. File[] dirfiles = dir.listFiles(new FileFilter() {
  136. // 自定义过滤规则 如果可以循环(包含子目录) 或则是以.class结尾的文件(编译好的java类文件)
  137. public boolean accept(File file) {
  138. return (recursive && file.isDirectory())
  139. || (file.getName().endsWith(".class"));
  140. }
  141. });
  142. // 循环所有文件
  143. for (File file : dirfiles) {
  144. // 如果是目录 则继续扫描
  145. if (file.isDirectory()) {
  146. findAndAddClassesInPackageByFile(packageName + "."
  147. + file.getName(), file.getAbsolutePath(), recursive,
  148. classes);
  149. } else {
  150. // 如果是java类文件 去掉后面的.class 只留下类名
  151. String className = file.getName().substring(0,
  152. file.getName().length() - 6);
  153. try {
  154. // 添加到集合中去
  155. //classes.add(Class.forName(packageName + '.' + className));
  156. //经过回复同学的提醒,这里用forName有一些不好,会触发static方法,没有使用classLoader的load干净
  157. classes.add(Thread.currentThread().getContextClassLoader().loadClass(packageName + '.' + className));
  158. } catch (ClassNotFoundException e) {
  159. // log.error("添加用户自定义视图类错误 找不到此类的.class文件");
  160. e.printStackTrace();
  161. }
  162. }
  163. }
  164. }
  165. }
  1. package me.gacl.util;
  2.  
  3. import java.lang.reflect.Constructor;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.InvocationTargetException;
  6. import java.lang.reflect.Method;
  7. import java.lang.reflect.Modifier;
  8.  
  9. /**
  10. * 对java反射中操作的一些封装
  11. */
  12. public class BeanUtils {
  13.  
  14. /**
  15. * 实例化一个class
  16. * @param <T>
  17. * @param clazz Person.class
  18. * @return
  19. */
  20. public static <T> T instanceClass(Class<T> clazz){
  21. if(!clazz.isInterface()){
  22. try {
  23. return clazz.newInstance();
  24. } catch (InstantiationException e) {
  25. e.printStackTrace();
  26. } catch (IllegalAccessException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. return null;
  31. }
  32.  
  33. /**
  34. * 通过构造函数实例化
  35. * @param <T>
  36. * @param ctor
  37. * @param args
  38. * @return
  39. * @throws IllegalArgumentException
  40. * @throws InstantiationException
  41. * @throws IllegalAccessException
  42. * @throws InvocationTargetException
  43. */
  44. public static <T> T instanceClass(Constructor<T> ctor, Object... args)
  45. throws IllegalArgumentException, InstantiationException,
  46. IllegalAccessException, InvocationTargetException{
  47. makeAccessible(ctor);
  48. return ctor.newInstance(args);//调用构造方法实例化
  49. }
  50.  
  51. /**
  52. * 查找某个class的方法
  53. * @param clazz
  54. * @param methodName
  55. * @param paramTypes
  56. * @return
  57. * @throws SecurityException
  58. * @throws NoSuchMethodException
  59. */
  60. public static Method findMethod(Class<?> clazz, String methodName, Class<?>... paramTypes){
  61. try {
  62. return clazz.getMethod(methodName, paramTypes);
  63. } catch (NoSuchMethodException e) {
  64. return findDeclaredMethod(clazz, methodName, paramTypes);//返回共有的方法
  65. }
  66. }
  67.  
  68. public static Method findDeclaredMethod(Class<?> clazz, String methodName, Class<?>[] paramTypes){
  69. try {
  70. return clazz.getDeclaredMethod(methodName, paramTypes);
  71. }
  72. catch (NoSuchMethodException ex) {
  73. if (clazz.getSuperclass() != null) {
  74. return findDeclaredMethod(clazz.getSuperclass(), methodName, paramTypes);
  75. }
  76. return null;
  77. }
  78. }
  79.  
  80. public static Method [] findDeclaredMethods(Class<?> clazz){
  81. return clazz.getDeclaredMethods();
  82. }
  83.  
  84. public static void makeAccessible(Constructor<?> ctor) {
  85. if ((!Modifier.isPublic(ctor.getModifiers())
  86. || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers()))
  87. && !ctor.isAccessible()) {
  88. ctor.setAccessible(true);//如果是私有的 设置为true 使其可以访问
  89. }
  90. }
  91.  
  92. public static Field[] findDeclaredFields(Class<?> clazz){
  93. return clazz.getDeclaredFields();
  94. }
  95. }

Listener-Class in Web.xml

  1. <listener>
  2. <listener-class>com.sanlogic.uum.init.SystemSettingContextListener</listener-class>
  3. </listener>
  4. <listener>
  5. <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
  6. </listener>
  7. <listener>
  8. <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
    </listener>

Servlet - Reasource loading的更多相关文章

  1. diff和common

    diff 命令 diff命令:找出两个文件的不同点,用于比较文件的差异 linux上非常重要的工具,一般用于制作补丁文件,特别是比较两个版本不同的文件以找到改动的地方. diff在命令行中打印每一个行 ...

  2. Tomcat启动过程中卡住了

    我在部署完项目后,debug启动Tomcat会在中间卡住不继续执行,测试发现在不部署项目的时候Tomcat是可以正常启动的. 控制台信息如下: 十月 25, 2017 10:40:44 上午 org. ...

  3. maven项目使用SOLR时报 previously initiated loading for a different type with name "javax/servlet/http/HttpServletRequest" 错的解决方法

    环境:Apache solr4.8,maven3,IntellijIDEA 想在项目中使用solr 在pom.xml文件中添加了solr的依赖 solr-core,solrj 和solr-dataim ...

  4. Java: some learning note for Java calssloader and Servlet

    1. Java Classloader 链接: https://en.wikipedia.org/wiki/Java_Classloader 摘要: The Java Classloader is a ...

  5. servlet(1)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  6. 解决Eclipse启动Tomcat时报Error loading WebappClassLoader错误

    最近新建了一个JSF项目(网上查到用Struts,Spring MVC也会如此),配置好以后用Eclipse启动Tomcat报了如下错误:严重: Error loading WebappClassLo ...

  7. Class loading in JBoss AS 7--官方文档

    Class loading in AS7 is considerably different to previous versions of JBoss AS. Class loading is ba ...

  8. web后台获取不到session中的值(loading sessions from persistent storage),后改用JS传值

    线上的程序似乎从session中取不到domain数据,重启了一下tomcat查看log日志发现,居然有报错.错误信息如下 22-Sep-2016 00:52:16.562 SEVERE [local ...

  9. Servlet配置load-on-startup

    <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http:// ...

随机推荐

  1. 基于Allwinner的Audio子系统分析(Android-5.1)

    前言 一直想总结下Audio子系统的博客,但是各种原因(主要还是自己懒>_<),一直拖到现在才开始重新整理,期间看过H8(Android-4.4),T3(Android-4.4),A64( ...

  2. Spring Boot中自动执行sql脚本

    说明:所有的代码基于SpringBoot 2.0.3版本 背景 在应用程序启动后,可以自动执行建库.建表等SQL脚本.下文中以要自动化执行people.sql脚本为例说明,脚本在SpringBoot工 ...

  3. (转)MySQL自带的性能压力测试工具mysqlslap详解

    mysqlslap 是 Mysql 自带的压力测试工具,可以模拟出大量客户端同时操作数据库的情况,通过结果信息来了解数据库的性能状况 mysqlslap 的一个主要工作场景就是对数据库服务器做基准测试 ...

  4. MYSQL 本地无ROOT权限 忘记密码

    打开CMD窗口 net stop mysql //停止MYSQL mysqld  -nt  --skip-grant-tables //跳过密码检测. mysqld.exe在Bin目录下 然后另外新打 ...

  5. 《LeetBook》leetcode题解(7): Reverse Integer[E]——处理溢出的技巧

    我现在在做一个叫<leetbook>的开源书项目,把解题思路都同步更新到github上了,需要的同学可以去看看 书的地址:https://hk029.gitbooks.io/leetboo ...

  6. 关于语法节点Tree、类型Type和符号Symbol

    每个语法节点Tree都有Type属性,部分的语法节点有Symbol属性,如下: 与Symbol类型与Type类型之间的关系如下: 下面是Symbol与Type之间的关系: (1)MethodSymbo ...

  7. python-多进程类封装

    #!/usr/bin/python import multiprocessing,time class ClockProcess(multiprocessing.Process): def __ini ...

  8. JavaScript数据结构-4.栈操作

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. AngularJS国际化配置

    AngularJS国际化配置 下载angular-translate 下载zip包:https://github.com/angular-translate/bower-angular-transla ...

  10. fgets()函数读取键盘,去掉换行符或丢弃多余的字符

    在上一遍随笔中,我们知道可以用fgets()函数来代替不安全的gets()函数.fgets函数中的第二个参数限制了读取的个数. 上篇文章也提到,fgets是会读取回车换行符的.有时候我们并不希望在字符 ...