Servlet

一、 Servlet

1.Servlet基本概念

每一个jsp页面就是一个java类,该类继承自:HttpJspBase -> HttpServlet

所以说一个jsp页面本质上就是一个servlet

Servlet的使用步骤

    1>.定义Servlet 

       添加一个普通的Java类,然后继承HttpServlet类。

       最后重写doGetdoPost方法。

   get方式发送的请求进入doGet方法处理Post方式发送的请求进入doPost方法处理。

    2>.web.xml中配置servlet

<servlet>

  <servlet-name>welcome_servlet</servlet-name>

  <servlet-class>jsp_charpter3_0908.Welcome</servlet-class>

</servlet>

<servlet-mapping>

  <servlet-name>welcome_servlet</servlet-name>

  <url-pattern>/welcome.html</url-pattern>

</servlet-mapping>

       注意:每个servlet都要配置两个xml节点:servletservlet-mapping 

             两个节点中servlet-name必须一样; 

             url-pattern:用于指定映射的url地址

2.Content-Type

  内容类型,一般是指网页中存在的Content-Type,用于定义网络文件的类型和网页的编码。

决定文件接收方将以什么形式、什么编码读取这个文件。

  常见的Content-Type

    text/css                层叠样式表

    text/javascript         js代码

    text/html               html代码

    text/plain              纯文本

    image/jpeg              图片jpg

    application/msword      word文档

    application/vnd.ms-excel     excel文档

    application/json

    response.setContentType("content-type");

3.基于注解配置Servlet

  在添加的Servlet类上面添加注解:WebServlet

  name:设置servlet的名称

  urlPatterns:设置servletUrl映射地址

  示例: 

      @WebServlet(name="delete_goods", urlPatterns={"/goods/delete.html"})

      public class AddGoods extends HttpServlet{...}

4.其他

  如何在Servlet中获取session

  HttpSession session = request.getSession();

二、 EL表达式

1. 基本概念

全名:Expression Language,即表达式语言。

作用:它提供了在 JSP 中简化表达式的方法,让Jsp代码更加简化。代替JSP页面中复杂的JAVA代码。

语法:EL表达式总是用大括号括起,而且前面有一个美元符($)前缀:${expression}

2. .[].运算符 

n EL 提供.[]两种运算符来存取数据。

点号操作符允许使用一个Map键或一个bean属性名来访问值。

例如:使用${foo.bar}可以得到bar属性的值。

注意:放在点号操作符右边的东西必须遵循Java的标识符命名规则!

n []操作符比点号功能更强大,因为利用[]可以访问数组和List

例如,如果musicList是一个ArrayList,可以用${musicList[0]}${musicList["0"]}来访问列表的第一个值。

注意:当要存取的属性名称中包含一些特殊字符,如.?等并非字母或数字的符号,就一定要使用 []

例如:${user.My-Name}应当改为${user["My-Name"] }

如果要动态取值时,就可以用[]来做,而.无法做到动态取值。

例如:${sessionScope.user[data]}data 是一个变量。

3. EL隐式隐含对象

n 与范围有关的隐含对象

pageScoperequestScopesessionScope applicationScope

EL中,这四个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。例如:我们要取得session中储存一个属性username的值,java代码session.getAttribute("username")。而在EL中则使用下列方法:${sessionScope.username}。如果获取的对象为null,使用el表达式则不会输出null,但是通过getAttribute会在页面中输出Null

${...Scope.name} 也可以这样写${name}

此时el会依次从pageScope>requestScope>sessionScope>applicationScope中查找name

n 与输入有关的隐含对象

与输入有关的隐含对象有两个:paramparamValues,它们是EL中比较特别的隐含对象。

例如:我们要取得用户的请求参数时,可以利用下列方法:

request.getParameter(String name)request.getParameterValues(String name) 。

EL中则可以使用paramparamValues两者来取得数据。 

语法格式为:${param.name}${paramValues.name}

4. 其他隐含对象

1>.cookie

   例:要取得cookie中名称为userCountry的值,可以使用${cookie.userCountry}来取得它。

2>.headerheaderValues

   header 储存用户浏览器和服务端用来沟通的数据 

   例:要取得用户浏览器的版本,可以使用${header["User-Agent"]}

5. EL运算符

1>.算术运算符有五个:+-*$/div%mod 

2>.关系运算符有六个:==eq!=ne<lt>gt<=le>=ge

3>.逻辑运算符有三个:&&and||or!not

4>.其它运算符有三个:Empty运算符、条件运算符、()运算符 

   例:${empty param.name}${A?B:C}${A*(B+C)} 

6. 其他

JSP页面中可以动态的启用或者禁用EL表达式

     <%@ page isELIgnored="true"%> 表示是否禁用EL语言,TRUE表示禁止.FALSE表示不禁止.JSP2.0中默认的启用EL语言.

三、 JSTL

1. JSTL简介

JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。

JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。

根据JSTL标签所提供的功能,可以将其分为5个类别。

n 核心标签

n 格式化标签

n SQL 标签

n XML 标签

n JSTL 函数

2. JSTL 库安装

Apache Tomcat安装JSTL 库步骤如下:

Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip)

下载地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

下载jakarta-taglibs-standard-1.1.1.zip 包并解压,将standard.jarjstl.jar文件拷贝到/WEB-INF/lib/下。

注意使用任何库,必须在每个JSP文件中的头部包含<taglib>标签。

3. 核心标签

核心标签是最常用的JSTL标签。引用核心标签库的语法如下:

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

标签             描述

<c:out>         用于在JSP中显示数据,就像<%= ... >

<c:set>         用于保存数据

<c:remove>         用于删除数据

<c:catch>         用来处理产生错误的异常状况,并且将错误信息储存起来

<c:if>             与我们在一般程序中用的if一样

<c:choose>         本身只当做<c:when><c:otherwise>的父标签

<c:when>         <c:choose>的子标签,用来判断条件是否成立

<c:otherwise>     <c:choose>的子标签,接在<c:when>标签后,当<c:when>false时被执行

<c:import>        检索一个绝对或相对 URL,然后将其内容暴露给页面

<c:forEach>    基础迭代标签,接受多种集合类型

<c:forTokens>    根据指定的分隔符来分隔内容并迭代输出

<c:param>        用来给包含或重定向的页面传递参数

<c:redirect>    重定向至一个新的URL.

<c:url>        使用可选的查询参数来创造一个URL

forEach标签讲解

<c:forEach var="" items="" varStatus="" begin="" end="" step=""></c:forEach>

【参数解析】:

         Ivar设定变量名用于存储从集合中取出元素。

         IIitems指定要遍历的集合。

         IIIvarStatus设定变量名,该变量用于存放集合中元素的信息。    

         IVbeginend用于指定遍历的起始位置和终止位置(可选)。

         Vstep指定循环的步长。

varStatus4个状态属性】: 

index:当前循环的索引值    

count:循环的次数   

frist:是否为第一个位置   

last:是否为最后一个位置

4. 格式化标签

JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:

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

标签                  描述

<fmt:formatNumber>  使用指定的格式或精度格式化数字

<fmt:formatDate>      使用指定的风格或模式格式化日期和时间

<fmt:formatDate value="${xx}" pattern="dd/MM/yyyy hh:mm aa"/>

四、 过滤器

1.过滤器

概念:过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。

    过滤器就是一个实现了Filter接口的Java类。

    在客户端的请求访问后端资源之前,拦截这些请求。 

    在服务器的响应发送回客户端之前,处理这些响应。

2.如何使用过滤器

1>.定义一个类,实现接口Filter

2>.重写initdestroydoFilter方法。

n init(FilterConfig arg0)方法在初始化过滤器时被调用,在生命周期内只执行一次。

n doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

拦截请求的核心方法。

//参数1:请求对象

HttpServletRequest request = (HttpServletRequest)req;

//参数2:响应对象

HttpServletResponse response = (HttpServletResponse)resp;

//参数3:过滤器链   chain 

n destroy()方法,在过滤器被销毁时调用。

3.课堂案例

编码过滤器:解决post提交时,中文乱码问题

n 权限过滤器:解决未登录状态下,拒绝访问系统资源。

@WebFilter(filterName="login_filter", urlPatterns={"/*"})

public class AuthFilter implements Filter {

 

@Override

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)

throws IOException, ServletException {

//参数1:请求对象

HttpServletRequest request = (HttpServletRequest)req;

//参数2:响应对象

HttpServletResponse response = (HttpServletResponse)resp;

//排除登录

String url = request.getRequestURL().toString();

if(url.toLowerCase().contains("login.html")){

//继续后续操作

chain.doFilter(request, response);

return;

}

//判断是否已经登录

if(request.getSession().getAttribute("user")==null){

//跳转到登录

response.sendRedirect(request.getContextPath() + "/login.html");

}else{

//继续后续操作

chain.doFilter(request, response);

}

}

 

@Override

public void destroy() {

}

 

@Override

public void init(FilterConfig arg0) throws ServletException {

}

}

 

n 获取请求消耗的时间的过滤器:查看系统中的性能瓶颈点。

4.过滤器的应用场合: 

身份验证过滤器(Authentication Filters)。

数据压缩过滤器(Data compression Filters)。

加密过滤器(Encryption Filters)。

n 触发资源访问事件过滤器。

图像转换过滤器(Image Conversion Filters)。

日志记录和审核过滤器(Logging and Auditing Filters)。

n MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。

标记化过滤器(Tokenizing Filters)。

五、 文件上传

1.JSP中实现文件上传

  1>.解决方案:Apache提供的文件上传组件。

  2>.将下面的两个jar包拷贝到lib目录。

     commons-fileupload-***.jar

     commons-io-***.jar

  3>.修改jsp页面中的form标记

     method属性一定要设置为post

     enctype属性的值设置为multipart/form-data

     注意:enctype="multipart/form-data"form表单将以二进制流的形式提交到web服务器。

           之后,就不能再通过request.getParameter("...")来获取参数值了,好郁闷... 

Tomcat7配置数据源

JDBC的操作中,打开和关闭数据库连接,是最耗费数据库资源的,我们可以在服务器上存放一定量的数据库连接,每当程序要连接数据库时,就将这些链接给它们,而一旦程序退出数据库操作时,要将这些链接返回给服务器。

数据库连接池负责分配、管理和释放数据库连接。这项技术能明显提高对数据库操作的性能。

下图是数据源的基本概念:

1:通过Connection Pool 管理数据库连接

2:通过Data Source 去管理Connection Pool

3: Data Source JNDI Tree 绑定

JNDI配置方式

现在来讲一下如何到服务器上对 Data Source 进行配置?

服务器: Tomcat 7

数据库:MySQL

1. 将下面的代码添加到Tomcat服务器上conf/context.xml中的<Context></Context>标签中

<Resource

       name="jdbc/shopping"

       auth="Container"

       type="javax.sql.DataSource"

       maxActive="100"

       maxIdle="30"

       maxWait="10000"

       username="root"

       password="root"

       driverClassName="com.mysql.jdbc.Driver"

       url="jdbc:mysql://localhost:3306/shopping"

/>

上下文context.xml中的参数的解析如下:

n name属性是数据源名称,通常采取jdbc/**.

n driverClassName属性是驱动程序名称。

n usernamepassword,数据库名称和密码

n url:访问的数据库路径。其中url的内容组成解析上篇博客中已经分析

n maxActive属性是并发连接的最大数。设置为0则无限制。

n maxWait属性是等待连接的最大连接的时间。

n maxIdle属性是连接池中空闲的连接的个数。

2. 添加jar

JDBC驱动程序mysql-connector-java-5-bin.jar放置在%TOMCAT_HOME%\lib和应用的WEB-INF\lib

3. 通过JAVA代码使用JDNI获取数据库连接对象

注意:在查找时需要对名称进行定位:java:comp/env

Connection conn = null;

try {

Context context = new InitialContext();

DataSource dataSource = (DataSource)context.lookup("java:comp/env/jdbc/shopping");

conn = dataSource.getConnection();

} catch (NamingException e) {

e.printStackTrace();

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值