[关闭]
@adamhand 2019-01-04T17:05:25.000000Z 字数 22677 阅读 775

CustomerManagement笔记


c3p0连接池配合QueryRunner的使用

简介

c3p0

实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池。c3p0就是这样一个连接池。

有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。

目前使用它的开源项目有:Spring、Hibernate等。

QueryRunner

QueryRunner是dbutils提供的类。Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,提供数据库操作的简单实现,包含增、删、改、查、批量以及事务等操作。

DbUtils有两个核心对象:QueryRunner类和ResultSetHandler接口。

DbUtils处理结果集主要靠Handler,主要有9个,作用如下所示:

QueryRunner可以使用可插拔的策略执行SQL查询,并处理 ResultSet结果集。QueryRunner主要有updata、insert和query三中函数,以及进行批量操作的batch函数。

使用

c3p0

使用c3p0需要注意两个问题:jar包和配置文件。

使用c3p0需要导入jar包:c3p0-0.9.2.1.jar,另外还需要数据库连接的jar包mysql-connector-java-5.1.40-bin.jar。或者使用mavren,依赖如下:

  1. <dependency>
  2. <groupId>commons-dbutils</groupId>
  3. <artifactId>commons-dbutils</artifactId>
  4. <version>1.6</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>mysql</groupId>
  8. <artifactId>mysql-connector-java</artifactId>
  9. <version>6.0.4</version>
  10. </dependency>

配置文件名称为c3p0-config.xml,名字固定,且只能放在src根目录下面。还需要注意在idea中需要在Project Structure中将src目录表为'Source',否则配置文件读不到。

配置文件的大概写法如下(因为这里使用的jdbc-connector的版本比较高,driverClass的名字已经由com.mysql.jdbc.Driver改为了com.mysql.cj.jdbc.Driver):

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <c3p0-config>
  3. <default-config>
  4. <property name="jdbcUrl">jdbc:mysql://localhost:3306/customermanagement</property>
  5. <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
  6. <property name="user">root</property>
  7. <property name="password">root</property>
  8. <property name="acquireIncrement">3</property>
  9. <property name="initialPoolSize">10</property>
  10. <property name="minPoolSize">2</property>
  11. <property name="maxPoolSize">10</property>
  12. </default-config>
  13. </c3p0-config>

参考:
数据库连接池C3P0,DBCP教程详解示例
Java 数据库系列教程--C3P0详解


DbUtils

使用DbUtils需要导入jar包mchange-commons-java-0.2.3.4.jar,或者maven依赖:

  1. <dependency>
  2. <groupId>commons-beanutils</groupId>
  3. <artifactId>commons-beanutils</artifactId>
  4. <version>1.9.1</version>
  5. </dependency>

dbUtils 中的各种 Handler 什么 意思


Servlet和JSP跳转方法

forward方式

形如request.getRequestDispatcher(“/index.jsp”).forward(request,response);。页面的路径是相对路径。forward方式只能跳转到本web应用中的页面上。跳转后地址栏不会发生变化。使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute

redirect方式

response.sendRedirect(“/index.jsp”);页面的路径是相对路径。sendRedirect可以将页面跳转到任何页面,不一定局限于web应用中,如:response.sendRedirect(”http://www.baidu.com“);

跳转后浏览器地址发生变化,只能在url总带parameter或者放在session中,无法使用request.setAttribute来传递值。


两者比较:


<a href= "LoginUrl?username=guangchen&pwd=123456" >跳转到Loginservler的doGet</a>

<jsp:forward page="" />

它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。

如果在之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。

另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交。

修改HTTP header的Location属性来重定向

通过设置直接修改地址栏来实现页面的重定向。

response.setHeader("Location","/index.jsp");

使用该函数可以实现定时跳转,比如下面的代码:

  1. response.setHeader("REFRESH","5; url=5_2.jsp");

实现5秒后自动跳转到5_2.jsp。

具体可以参见response.setHeader()的用法

使用JSP的meta标签来定时跳转

<meta http-equiv="refresh" content="300; url=target.jsp">

它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。


参考:
JSP跳转方式与Servlet跳转方式的区别
Servlet跳转页面的几种方法总结
jsp与servlet之间页面跳转及参数传递实例


Servlet与JSP的区别

servlet

Servlet是Java提供的用于开发Web服务器应用程序的一个组件,运行在服务器端,由Servlet容器所管理,用于生成动态的内容。servlet更擅长于逻辑控制,但是很难向网页中输出HTML页面内容。

jsp

JSP(Java Server Pages)的本质就是Servlet,或者说是简化的servlet。jsp和servlet的关系可以描述为下面的形式:JSP = HTML + Java代码 + JSP标签。显示数据非常方便,像html格式一样;但是封装数据和处理数据比较麻烦。

JSP页面在执行的时候都会被服务器端的JSP引擎转换为Servelet(.java),然后又由JSP引擎调用Java编译器,将Servelet(.java)编译为Class文件(.class),并由Java虚拟机(JVM)解释执行。

jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。


参考:
servlet与JSP区别
jsp和servlet有什么区别?
servlet与jsp区别与联系
jsp与servlet的区别与联系


BaseServlet

servlet执行的完整流程

浏览器请求



浏览器向服务器请求时,服务器不会直接执行我们的类,而是到web.xml里寻找路径名
①:第一步,浏览器输入访问路径后,携带了请求行,头,体
②:第二步,根据访问路径找到已注册的servlet名称,既图中的demo
③:第三步,根据映射找到对应的servlet名
④:第四步,根据根据servlet名找到我们全限定类名,既我们自己写的类

服务器创建对象



服务器找到全限定类名后,通过反射创建对象,同时也创建了servletConfig,里面存放了一些初始化信息(注意服务器只会创建一次servlet对象,所以servletConfig也只有一个)

调用init方法



①:对象创建好之后,首先要执行init方法,但是我们发现我们自定义类下没有init方法,所以程序会到其父类HttpServlet里找
②:我们发现HttpServlet里也没有init方法,所以继续向上找,既向其父类GenericServlet中继续寻找,在GenericServlet中我们发现了init方法,则执行init方法(对接口Servlet中的init方法进行了重写)

注意:
在GenericServlet中执行public void init(ServletConfig config)方法的时候,又调用了自己无参无方法体的init()方法,其目的是为了方便开发者,如果开发者在初始化的过程中需要实现一些功能,可以重写此方法

调用service方法



接着,服务器会先创建两个对象:ServletRequest请求对象和ServletResponse响应对象,用来封装浏览器的请求数据和封装向浏览器的响应数据

①:接着服务器会默认在我们写的类里寻找service(ServletRequest req, ServletResponse res)方法,但是DemoServlet中不存在,那么会到其父类中寻找
②:到父类HttpServlet中发现有此方法,则直接调用此方法,并将之前创建好的两个对象传入
③:然后将传入的两个参数强转,并调用HttpServlet下的另外个service方法
④:接着执行service(HttpServletRequest req, HttpServletResponse

resp)方法,在此方法内部进行了判断请求方式,并执行doGet和doPost,但是doGet和doPost方法已经被我们自己重写了,所以会执行我们重写的方法
看到这里,你或许有疑问:为什么我们不直接重写service方法?
因为如果重写service方法的话,我们需要将强转,以及一系列的安全保护判断重新写一遍,会存在安全隐患

向浏览器响应



servlet生命周期

由上面的servlet执行的流程可以总结出servlet的生命周期:

① 初始化阶段,调用init()方法。
② 响应客户请求阶段,调用service()方法。由service()方法根据提交方式选择执行doGet()或者doPost()方法。
③ 终止阶段,调用destory()方法。



JavaWeb BaseServlet的用法及原理

基础

一般写servlet的时候,基本上是每一个功能对应一个servlet程序,这样的结果是servlet和xml文件中的配置都冗余。

进阶

一个改进的方法是,将所有功能的servlet集成到一个文件中,使用request.getParameter()获得方法名,然后使用if或switch进行判断。但是这种方法还是有一个缺点:如果方法很多,if或者switch语句就会很多,既不美观,效率也不高。

高级

建立BaseServlet,利用反射获得当前的方法,并调用。

① 先获取请求携带的方法参数值
② 获取指定类的字节码对象
③ 根据请求携带的方法参数值,再通过字节码对象获取指定的方法
④ 最后执行指定的方法

  1. public class BaseServlet extends HttpServlet {
  2. public void doGet(HttpServletRequest request, HttpServletResponse response)
  3. throws ServletException, IOException {
  4. try {
  5. // 获取请求标识
  6. String methodName = request.getParameter("method");
  7. // 获取指定类的字节码对象
  8. Class<? extends BaseServlet> clazz = this.getClass();//这里的this指的是继承BaseServlet对象
  9. // 通过类的字节码对象获取方法的字节码对象
  10. Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
  11. // 让方法执行
  12. method.invoke(this, request, response);
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. }
  16. }
  17. public void doPost(HttpServletRequest request, HttpServletResponse response)
  18. throws ServletException, IOException {
  19. doGet(request, response);
  20. }
  21. }

参考:
Java servlet执行的完整流程(图解含源码分析)
JavaWeb BaseServlet的用法及原理(含图解执行流程)
Servlet执行流程


BeanUtils.populate()封装对象

BeanUtils工具是一种方便我们对JavaBean进行操作的工具。

使用BeanUtils需要导入jar包commons-beanutils,或者在maven中导入如下依赖。如果需要使用增强功能的话还需要导入commons‐logging‐1.2.jar // 日志记录包commons‐collections‐3.2.2.jar // 增强的集合包两个jar包。

  1. <dependency>
  2. <groupId>commons-beanutils</groupId>
  3. <artifactId>commons-beanutils</artifactId>
  4. <version>1.9.1</version>
  5. </dependency>

常用的功能有三个:

可以配合request.getParameterMap()方法,将用map获得的bean中的属性拷贝到一个bean中,生成一个对象。

  1. public static <T> T fillBean(HttpServletRequest request, Class<T> clazz){
  2. T bean = null;
  3. try {
  4. bean = clazz.newInstance();
  5. BeanUtils.populate(bean, request.getParameterMap());
  6. } catch (InstantiationException e) {
  7. e.printStackTrace();
  8. } catch (IllegalAccessException e) {
  9. e.printStackTrace();
  10. } catch (InvocationTargetException e) {
  11. e.printStackTrace();
  12. }
  13. return bean;
  14. }

参考:
BeanUtils
BeanUtils工具


servlet传递参数的方法

JSP传值给Servlet

JSP传值给Servlet有几种形式:Form表单传值,url传值java代码传值。

① form表单传值:

  1. <form name="myForm" method="post" action="actionname">
  2. <input name="username"type="text" />
  3. <input name="password"type="password" />
  4. </form>
  5. <!--action里面也可以传参数,在method=get下,form表单只接收表单元素”name“属性和相应的”value“。想要通过在action中自己写?的形式传值,method的值必须是=post
  6. 如:action="actionname?pass=11"-->

在点击提交按钮的时候,数据就会提交到后台,让actionname这个action去处理:

  1. request.getParameter("username")

② url传值:

  1. <a href="/myServlet?param1=aa&m2=bb"/> 在后台直接用request.getParameter("param1")得到aa的值

③ java代码传值:

  1. java片段代码,servlet只能接到 session.setAttribute("testSession","Hello session")的内容,而接不到 request的内容。在 servlet里用 request.getSession().getAttribute("testSession")获取 session内容。

Servlet传值给Jsp

① redirect 方式
这种方式要传值出去的话,只能在url中带parameter或者放在session中,无法使用request.setAttribute来传递。

② forward方式
使用这种方式跳转,传值可以使用三种方法:url中带parameter,session,request.setAttribute。


注意:如果在jsp中使用${param}接收不到servlet传过来的信息,而是将param以字符串的方式打印,可能是xml版本过低,可以去web.xml中修改,如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">

参考:jstl的taglib不起作用——c标签不起作用


补充:request.getParameter() 和request.getAttribute() 区别

方法成对

只有getParameter(),没有setParameter();setAttribute()和getAttribute()是一对;

请求方式

getParameter():响应的是两个web组件之间为链接(重定向)关系时,如get和post表单提交请求,传递请求参数,注意此种方法是从web客户端向web服务端传递数据,代表HTTP请求数据

  1. <form name="form1" method="post" action="2.jsp">
  2. <input type="text" name="username" />
  3. <input type="submit" value="提交" />
  4. </form>

1.jsp中有<a href="2.jsp?username=accp">2.jsp</a>,在2.jsp中通过request.getParameter("username")来获得请求参数username

getAttribute():响应的两个web组件之间为转发关系时,服务端的转发源通过setAttribute()设置传递的参数,然后转发目的通过getAttribute()获取传递的参数,这样转发时数据就不会丢失,注意此种方法只存在于web容器内部

servlet端代码为:

  1. //pageModel是个对象
  2. request.setAttribute("pageModel", pageModel);
  3. request.getRequestDispatcher("/basedata/item_maint.jsp").forward(request, response);

另一个.jsp代码为(需要强制转换):

  1. PageModel pageModel = (PageModel) request.getAttribute("pageModel");

返回类型


参考:
servlet和jsp之间传值的方式
request.getParameter() 和request.getAttribute() 区别


mvc与三层结构的区别

首先说明,这两种不是一种东西,也没有严格的对应关系。三层结构是一种架构,而mvc是一种设计模式。

三层结构

三层架构是界面层(UI)、业务逻辑层(BLL)和数据访问层(DAL)。是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑。

mvc

mvc是Models、Views和Controller。主要是为了解决应用程序用户界面的样式替换问题,把展示数据的 HTML 页面尽可能的和业务代码分离。MVC把纯净的界面展示逻辑(用户界面)独立到一些文件中(Views),把一些和用户交互的程序逻辑(Controller)单独放在一些文件中,在 Views 和 Controller 中传递数据使用一些专门封装数据的实体对象,这些对象,统称为Models。

只所以说MVC和三层毫无关系,是因为它们二者使用范围不同:三层可以应用于任何语言、任何技术的应用程序;而MVC只是为了解决BS应用程序视图层各部分的耦合关系。它们互不冲突,可以同时存在,也可根据情况使用其中一种。

但它们的存在都是为了解耦。

补充:关于view、controller、service、dao的理解


参考:
mvc与三层结构终极区别
关于view、controller、service、dao的理解


JSP标签

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

使用taglib标签需要在jsp中加入:

  1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

并且在maven中导入

  1. <dependency>
  2. <groupId>taglibs</groupId>
  3. <artifactId>standard</artifactId>
  4. <version>1.1.0</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>jstl</groupId>
  8. <artifactId>jstl</artifactId>
  9. <version>1.1.0</version>
  10. </dependency>

web.xml文件

web.xml中常见的元素标签

元素1 <icon>

<small-icon>/路径/smallicon.gif</small-icon>。small-icon元素应指向web站台中某个小图标的路径,大小为16 X 16 pixel,但是图象文件必须为GIF或JPEG格式,扩展名必须为:.gif或.jpg。

<large-icon>/路径/largeicon-jpg</large-icon>。large-icon元素应指向web站台中某个大图表路径,大小为32 X 32 pixel,但是图象文件必须为GIF或JPEG的格式,扩展名必须为; gif或jpg。

  1. <icon>
  2. <small-icon>/images/small.gif</small-icon>
  3. <large-icon>/images/large.gif</large-icon>
  4. </icon>

元素2、3:<display-name><description>

<display-name>应用名称</display-name>。定义应用的名称。

<description>应用描述</discription>。对应用做出描述。

  1. <display-name>test</display-name>
  2. <description>测试应用V1.0</discription>

元素4:<context-param>

<context-param>元素含有一对参数名和参数值,用作应用的servlet上下文初始化参数,参数名在整个Web应用中必须是惟一的,在Web应用的整个生命周期中上下文初始化参数都存在,任意的Servletjsp都可以随时随地访问它。<param-name>子元素包含有参数名,而<param-value>子元素包含的是参数值。作为选择,可用<description>子元素来描述参数。

那么。什么情况下使用,为什么使用<context-param>
比如:定义一个管理员email地址用来从程序发送错误,或者与你整个应用程序有关的其他设置。使用自己定义的设置文件需要额外的代码和管理;直接在你的程序中使用硬编码(Hard-coding)参数值会给你之后修改程序带来麻烦,更困难的是,要根据不同的部署使用不同的设置;通过这种办法,可以让其他开发人员更容易找到相关的参数,因为它是一个用于设置这种参数的标准位置。

Spring配置文件中该如何配置:
配置Spring,必须需要<listener>,而<context-param>可有可无,如果在web.xml中不写<context-param>配置信息,默认的路径是/WEB-INF/applicationontext.xml,在WEB-INF目录下创建的xml文件的名称必须是applicationContext.xml。如果是要自定义文件名可以在web.xml里加入contextConfigLocation这个context参数:在<param-value></param-value>里指定相应的xml文件名,如果有多个xml文件,可以写在一起并以“,”号分隔,使用自定义配置例子如下:

  1. <!-- spring config -->
  2. <context-param>
  3. <param-name>contextConfigLocation</param-name>
  4. <param-value>/WEB-INF/spring-configuration/*.xml</param-value>
  5. </context-param>
  6. <listener>
  7. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  8. </listener>

context-param 元素用来设定web应用的环境参数(context),它包含两个子元素:param-nameparam-value

<param-name>参数名称</param-name>。设定Context名称

<param-value>值</param-value>。设定Context名称的值

  1. <context-param>
  2.    <param-name>param_name</param-name>
  3.    <param-value>param_value</param-value>
  4. </context-param>

此所设定的参数,在JSP网页中可以使用下列方法来取得:${initParam.param_name}

若在Servlet可以使用下列方法来获得:String param_name=getServletContext().getInitParamter("param_name");

元素5,6:<filter><filter-mapping>

filter元素用来设定web应用的过滤器,它的两个主要子元素filter-namefilter-class用来定义Filter所对应的class

<filter-name>Filter的名称</filter-name>。定义Filter的名称

<filter-class>Filter的类名称</filter-class>。定义Filter的类名称

filter-mapping 元素的两个主要子元素filter-nameurl-pattern。用来定义Filter所对应的URL

<filter-name>Filter的名称</filter-name>。定义Filter的名称.

<url-pattern>URL</url-pattern>Filter所对应的RUL。例如:<url-pattern>/Filter/*</url-pattern>

  1. <filter>
  2.   <filter-name>Encoding</filter-name>
  3.   <filter-class>ghjf.test.filter.SetCharacterEncodingFilter</filter-class>
  4.   <init-param>
  5.      <param-name>encoding</param-name>
  6.      <param-value>GBK</param-value>
  7.   </init-param>
  8. </filter>
  9. <filter-mapping>
  10.    <filter-name>Encoding</filter-name>
  11.    <url-pattern>/*</url-pattern>
  12. </filter-mapping>

元素7:<listener>

<listener>主要用于监听Web应用事件,其中有两个比较重要的WEB应用事件:应用的启动和停止(starting up or shutting down)Session的创建和失效(created or destroyed)

listener元素用来定义Listener接口,它的主要子元素为<listener-class>

<listen-class>Listener的类名称</listener-class>。定义Listener的类名称

  1. <listener>
  2.   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  3. </listener>

上面这段配置的意思是加载spring的监听器,其中ContextLoaderListener的作用就是启动Web容器时,自动装配applicationContext.xml的配置信息,执行它所实现的方法。

元素8、9:<servlet><servlet-mapping>

servlet元素的两个主要子元素servlet-nameservlet-class用来定义servlet所对应的class

<servlet-name>servlet的名称</servlet-name>。定义servlet的名称

<servlet-class>servlet的类名称</servlet-class>。定义servlet的类名称

servlet-mapping元素包含两个子元素servlet-nameurl-pattern。用来定义servlet所对应URL

<servlet-name>Servlet的名称</servlet-name>。定义Servlet的名称.

<url-pattern>Servlet URL</url-pattern>。定义Servlet所对应的RUL。例如:<url-pattern>/Servlet/*</url-pattern>

  1. <servlet>
  2.  <servlet-name>dwr-invoker</servlet-name>
  3.  <display-name>DWR Servlet</display-name>
  4.  <description>Direct Web Remoter Servlet</description>
  5.  <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
  6.  <init-param>
  7.      <param-name>debug</param-name>
  8.      <param-value>true</param-value>
  9.  </init-param>
  10. </servlet>
  11. <servlet-mapping>
  12.  <servlet-name>dwr-invoker</servlet-name>
  13.  <url-pattern>/dwr/*</url-pattern>
  14. </servlet-mapping>

元素10:<session-cofing>

session-config包含一个子元素session-timeout。定义web应用中的session参数。

<session-timeout>分钟</session-timeout>。定义这个web站台所有`session的有效期限。单位为分钟。该元素值必须为整数。如果 session-timeout元素的值为零或负数,则表示会话将永远不会超时。

  1. <session-config>
  2.    <session-timeout>30</session-timeout>
  3. </session-config>

元素11:<mime-mapping>

mime-mapping包含两个子元素extensionmime-type。定义某一个扩展名和某一MIME Type做对映。

<extension>扩展名名称</extension>。扩展名称
<mime-type>MIME格式</mime-type>。MIME格式

  1. <mime-mapping>
  2.    <extension>doc</extension>
  3.    <mime-type>application/vnd.ms-word</mime-type>
  4. </mime-mapping>
  5. <mime-mapping>
  6.    <extension>xls</extension>
  7.    <mime-type>application/vnd.ms-excel</mime-type>
  8. </mime-mapping>
  9. <mime-mapping>
  10.    <extension>ppt</extesnion>
  11.    <mime-type>application/vnd.ms-powerpoint</mime-type>
  12. </mime-mapping>

元素12:<welcome-file-list>

<welcome-file-list>包含一个子元素<welcome-file><welcome-file>用来指定首页文件名称。<welcome-file-list>元素可以包含一个或多个<welcome-file>子元素。如果在第一个<welcome-file>元素中没有找到指定的文件,Web容器就会尝试显示第二个,以此类推。

  1. <welcome-file-list>
  2. <welcome-file>index.jsp</welcome-file>
  3. <welcome-file>index.htm</welcome-file>
  4. </welcome-file-list>

元素13:<error-page>

error-page元素包含三个子元素error-code,exception-typelocation。将错误代码(Error Code)或异常(Exception)的种类对应到web应用资源路径。

<error-code>错误代码</error-code>。HTTP Error code,例如: 404、403

<exception-type>Exception</exception-type>。一个完整名称的Java异常类型

<location>/路径</location>。在web应用内的相关资源路径

  1. <error-page>
  2.    <error-code>404</error-code>
  3.    <location>/error404.jsp</location>
  4. </error-page>
  5. <error-page>
  6.    <exception-type>java.lang.Exception</exception-type>
  7.    <location>/exception.jsp</location>
  8. </error-page>

元素14:<jsp-config>

jsp-config元素主要用来设定JSP的相关配置,<jsp:config>包括<taglib><jsp-property-group>两个子元素。其中<taglib>元素在JSP 1.2时就已经存在了;而<jsp-property-group>是JSP 2.0新增的元素。

taglib元素包含两个子元素taglib-uritaglib-location。用来设定JSP网页用到的Tag Library路径。

<taglib-uri>URI</taglib-uri>taglib-uri定义TLD文件的URI,JSP网页的taglib指令可以经由这个URI存取到TLD文件。

<taglib-location>/WEB-INF/lib/xxx.tld</taglib-laction>TLD文件对应Web站台的存放位置。

jsp-property-group元素包含8个元素,分别为:
<description>Description</descrition>。此设定的说明

<display-name>Name</display-name>。此设定的名称

<url-pattern>URL</url-pattern>。设定值所影响的范围,如:/CH2 或者/*.jsp

<el-ignored>true|false</el-ignored>。若为true,表示不支持EL语法.

<scripting-invalid>true|false</scripting-invalid>。若为true表示不支持<%scription%>语法.

<page-encoding>encoding</page-encoding>。设定JSP网页的编码

<include-prelude>.jspf</include-prelude>。设置JSP网页的抬头,扩展名为.jspf

<include-coda>.jspf</include-coda>。设置JSP网页的结尾,扩展名为.jspf

  1. <jsp-config>
  2. <taglib>
  3.    <taglib-uri>Taglib</taglib-uri>
  4.    <taglib-location>/WEB-INF/tlds/MyTaglib.tld</taglib-location>
  5. </taglib>
  6. <jsp-property-group>
  7.    <description>
  8.       Special property group for JSP Configuration JSP example.
  9.    </description>
  10.    <display-name>JSPConfiguration</display-name>
  11.    <uri-pattern>/*</uri-pattern>
  12.    <el-ignored>true</el-ignored>
  13.    <page-encoding>GB2312</page-encoding>
  14.    <scripting-inivalid>true</scripting-inivalid>
  15. </jsp-property-group>
  16. </jsp-config>

元素15:<resource-env-ref>

resource-env-ref有两个子元素:

  1. <!--资源的名称 相对于java:comp/env-->
  2. <resource-env-ref-name>资源名</resource-env-ref-name>
  3. <!--当web应用查找该资源的时候,返回的Java类名的全称-->
  4. <resource-env-ref-type>查找资源时返回的资源类名</resource-env-ref-type>
  1. <resource-env-ref>
  2. <resource-env-ref-name>jdbc/mssql</resource-env-ref-name>
  3. <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
  4. </resource-env-ref>

元素16:<resource-ref>

resource-ref元素包括五个子元素description,res-ref-name,res-type,res-auth,res-sharing-scope。利用JNDI取得应用可利用资源。

  1. <!--资源说明-->
  2. <description>说明</description>
  3. <!--资源名称-->
  4. <rec-ref-name>资源名称</rec-ref-name>
  5. <!--资源种类-->
  6. <res-type>资源种类</res-type>
  7. <!--资源由Application或Container来许可-->
  8. <res-auth>Application|Container</res-auth>
  9. <!--资源是否可以共享。默认值为 Shareable-->
  10. <res-sharing-scope>Shareable|Unshareable</res-sharing-scope>
  1. <resource-ref>
  2.    <description>JNDI JDBC DataSource</description>
  3.    <res-ref-name>jdbc/data</res-ref-name>
  4.    <res-type>javax.sql.DataSoruce</res-type>
  5.    <res-auth>Container</res-auth>
  6. </resource-ref>

web.xml加载过程

先说一下,web.xml的家在过程为:context-param -> listener -> filter -> servlet

① 启动WEB项目的时候,容器首先会去它的配置文件web.xml读取两个节点: <listener></listener><context-param></context-param>
② 紧接着,容器创建一个ServletContext(application),这个WEB项目所有部分都将共享这个上下文。
③ 容器以 的name作为键,value作为值,将其转化为键值对,存入ServletContext
④ 接着,容器会读取,根据指定的类路径来实例化过滤器。
⑤ 以上都是在WEB项目还没有完全启动起来的时候就已经完成了的工作。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟。。如果系统中有Servlet,则Servlet是在第一次发起请求的时候被实例化的,而且一般不会被容器销毁,它可以服务于多个用户的请求。所以,Servlet的初始化都要比上面提到的那几个要迟。


参考:
java web工程web.xml配置详解
web.xml配置详解


session生命周期

session简介

session的英文意思是“一段时间”。在计算机专业术语中,Session是指一个终端用户与交互系统进行通信的时间间隔,通常指从注册进入系统到注销退出系统之间所经过的时间以及如果需要的话,可能还有一定的操作空间。

具体到Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。因此从上述的定义中我们可以看到,Session实际上是一个特定的时间概念。

Session是用于存放用户与web服务器之间的会话,即服务器为客户端开辟的存储空间。

由于客户端与服务器之间的会话是无状态的机制,Session则可用于关联访问,因此多用与用户登录等功能上。

我们可以调用request的getsession()方法来使用session,通过setAttribute()注入值:

  1. //引号中的"xxx"为页面中name标签里的值,逗号后面的是Servlet中的变量名。
  2. request.getSession().setAttribute("xxx",xxx);//储存到session中

之后可以用getAttribute()方法来获取session中的值:

  1. request.getSession().getAttribute("xxx",xxx);//读取session中的值

[注]:无状态的意思是会话之间无关联性,无法识别该用户曾经访问过。

session和cookie

Session存在的意义是为了提高安全性,它将关键数据存在服务器端。与cookie不同,cookie则是将数据存在客户端的浏览器中。

因此cookie是较为危险的,若客户端遭遇黑客攻击,信息容易被窃取,数据也可能被篡改,而运用Session可以有效避免这种情况的发生。

具体参见浅谈Session与Cookie的区别与联系

session生命周期

session创建时机

session销毁时机

注意:

设置session失效时间

① web.xml中

  1. <session-config>
  2. <session-timeout>30</session-timeout>
  3. </session-config>

② 在程序中手动设置

  1. session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期
  2. request.getSession().setMaxInactiveInterval(-1);//永不过期

③ tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:

  1. <Context path="/livsorder"
  2. docBase="/home/httpd/html/livsorder"   defaultSessionTimeOut="3600"
  3. isWARExpanded="true"   
  4. isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

Session的生命周期和工作原理
Session的生命周期1
session的生命周期2


遇到的问题

c3p0启动的时候找不到c3p0-config.xml文件

首先,c3p0-config.xml文件应该放在src目录下面;其次,要将src目录标位source(IDEA中在File/Project Structure/Modules,如下图所示)。



连接数据库:ERROR: The server time zone value '�й�׼' is unrecognized or represents more than one time zone

提示系统时区出现错误。
办法1:可以在mysql中执行命令:
set global time_zone='+8:00';

办法2:或者在数据库驱动的url后加上serverTimezone=UTC参数:

  1. <property name="jdbcUrl">jdbc:mysql://localhost:3306/customermanagement?serverTimezone=UTC</property>

注意:这种写法的时候,如果该参数是‘?’后的第一个,则不会出现问题,但是如果不是第一个,比如下面这种写法:
jdbc:mysql://localhost:3306/exam?characterEncoding=utf8&serverTimezone=UTC
会报错的,会提示The reference to entity “serverTimezone” must end with the ‘;’ delimiter.
运行后控制台也会出现 对实体 “serverTimezone” 的引用必须以 ‘;’ 分隔符结尾 的错误提示。

将代码改为:

  1. <property name="jdbcUrl"> jdbc:mysql://localhost:3306/exam?characterEncoding=utf8&amp;serverTimezone=UTC </property>

这里的&amp;就像相当于&;,因为在html&需要转义一下, 写为&amp

参考这里

1. Loading class com.mysql.jdbc.Driver'. This is deprecated. The new driver class iscom.mysql.cj.jdb

这个问题是因为用了最新的mysql 连接驱动,修改一下driverClass即可。
之前的driverClass:

  1. <property name="driverClass">com.mysql.jdbc.Driver</property>

修改后的driverClass:

  1. <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注