Skip to content

javaweb

servlet技术

Servlet的作用

  1. 处理表单提交
  2. 用户认证
  3. 会话管理
  4. 请求转发和重定向
  5. 生成动态Web内容
  6. 扩展基于HTTP协议的Web服务器

servlet如何与客户端通信

客户端发送请求,服务器接收请求,Servlet容器根据请求的地址以及Servlet之间的映射,调用相应的Servlet,Servlet处理完数据后将结果转交给Servlet容器,并通过Http服务器将响应结果传输给客户端。

基本使用方法

java
//定义servlet名字和请求的地址
@WebServlet(name="servlet",urlPatterns="/servlet")
public MyServlet extends HttpServlet{
    // 接收get请求时执行
    public doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
        //TODO
    }
    // 接收post请求时执行
    public doPoset(HttpServletRequest request,HttpServletResponse response) throws SerlvetException,IOException{
        //TODO
	}
}

生命周期

  1. 初始化阶段,当有请求时,Servlet容器会创建Servlet的实例,并调用init()方法进行初始化。
  2. 运行阶段,创建的Servlet对象会调用service()方法处理请求。
  3. 销毁阶段,当服务器关闭或web应用被移除容器时,Servlet会调用destory()方式进行销毁。

常用方法

  • 设置中文

    java
    //设置HttpServletResponse使用utf-8编码
    response.setCharacterEncoding("utf-8");
    //通知浏览器使用utf-8解码
    response.setHeader("Content-Ytpe","text/html;charset=utf-8");
    java
    //包含第一种的两种功能
    response.setContentType("text/html;charset=utf-8");
    java
    //request只能设置setCharacterEncoding属性
    request.setCharacterEncoding("utf-8");
  • 输出信息

    java
    PrintWriter print = response.getWriter();
    print.writer("信息")
  • 重定向

    java
    response.seedRedirect("/login.html")
  • 请求转发

    java
    //获得RequestDispatcher对象
    RequestDispatcher dispatcher = request.getRequestDispatcher("/login");
    //转发
    dispatcher.forward(request,response)
  • 获得请求参数

    获取用户提交的表单内容

    java
    //获取指定参数
    String value = request.getParameter("user");
    //获取多个同名参数
    String[] values = request.getParameterValue("user");
  • 通过Requset传递参数

    java
    //存放数据,属性名和属性值
    requst.setAttribute("user","lisi");
    //读取数据
    String name = request.getAttribute("user");
    //移除属性
    request.removeAttribute("user");
  • getParameter()和getAttribute()的区别

    getParameter()读取的是从客户端发送请求中的参数,代表的http请求,返回类型只有string

    getAttribute()读取的是从其他页面转发来的请求的数据,需要与setAttribute()配合使用,返回类型可以是String或者是对象。

Filter

filter用于拦截并修改request和reponse对象

Filter的常见作用

能够对请求和响应进行检查和修改,通常将请求拦截后进行一些通用的操作,例如: 过滤敏感词、统一字符编码、权限控制,还可以提取公共代码提高程序性能。

基本使用方法

java
//定义过滤器的名字和拦截servlet地址
@WebFilter(filterName="filter",urlPatterns="/servlet") implements FIlter{
    //初始化时执行
    public void init(FilterConfig fc){
    }
    //运行时执行
   	public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws ServletException,IOException{
        //调用FilterChain.doFilter(request,response)方法继续执行servlet。
        chain.doFilter(request,response)
    }
    //销毁时执行
    public void destory(){
    }
}

生命周期

  • 创建阶段:当启动服务器时,会调用init()方法进行初始化。
  • 运行阶段:当有请求时,服务器会筛选出符合条件的过滤器,执行其doFilter()方法.
  • 销毁阶段:当服务器关闭时,服务器会调用destroy()方法进行销毁。

注解

  • @WebServlet
  • @WebFilter
  • @webListener:修饰Listener类,部署Listener类
  • @WebInitParam:为@WebServlet、@WebFilter注解配置参数
  • @MultipartConfig:
  • @ServletSecurity

会话技术

会话是指客户端和服务器之间连续发生的一系列请求和响应过程,服务器跟踪用户信息的技术称为会话技术,在servlet中提供两个用于保存会话数据的对象,分别是cookie和session

保存在浏览器本地中,可以长期保存,存储的内容较少

基本使用

java
//判断是否有cookie
Cookie[] cookies = request.getCookie();
for(Cookie cookie : cookies){
    if("cookieName".equals(cookies.getName())){
        //读取值
        System.out.println(cookie.getValue());
    }
}
// 不是第一次可以设置cookie
Cookie cookie = new Cookie("cookieName","cookieValue");
//设置有效时间一分钟,负数代码退出浏览器立马销毁
cookie.setmaxAge(60);
//添加cookie
response.addCookie(cookie);

SESSION

保存在服务器中,生命周期比cookie短,存储的内容较多。超时是指在指定时间内没有任何请求,tomcat默认超时时间为30分钟。

基本使用

java
//获取或创建Session,getSession(false)表示不存在时返回null,其他情况会自动创建
HttpSession session = request.getSession();
//设置属性
request.getSession().setAttribute("SessionName","sessionValue");
//读取属性值
String value = request.getSession().getAttribute("SessionName");
//使用cookie保存
Cookie cookie = new Cookiew("JSESSIONID",session.getId());

设置超时时间

  1. 立刻注销该reques的session

    java
    HttpSession session = request.getSession();
    session.invalidate()
  2. 在web.xml设置失效时间,默认单位为分钟

    xml
    <session-config>   
        <session-timeout>30</session-timeout>
    </session-config>
  3. 在servlet中设置失效时间,默认单位为秒,-1则是从不超时

    java
    session.setMaxInactiveInterval(60*60);

JSP

jsp运行时jsp容器会把jsp文件转换为servlet

语法

  • 定义

    <%!...%>

  • 执行

    <%...%>

  • 输出

    <%=...%>

  • 指令

    <%@...%>

指令

  • page

    <%@ page 属性名1=属性值1...%>

  • include

    <%@ include file="被包含的文件地址"%>

  • taglib

    <%@ taglib prefix="指定标签的前缀" uri="标签地址"%>

    标签统一地址:http://java/sun/com/jsp/jstl/具体标签库名

    具体标签库有五个

    • 核心标签库(core)
    • 格式标签库(fmt)
    • SQL标签库(sql)
    • XML标签库(xml)
    • 函数标签库(functions)

    组合结果:<%@ taglib prefix="c" uri="http://java/sun/com/jsp/jstl/core"%>

动作元素

  • 包含文件元素

    <jsp:include page="URL" flush="true|false />"

  • 请求转发元素

    <jsp:forward page="URL />"

  • <jsp:useBean><jps:setProperty>

    创建bean的实例和为实例赋值

    jsp
    <jsp:useBean id="JavaBean实例名" class="bean所在的包名">
        <jsp:setProperty name = "JavaBean实例名" property = "JavaBean属性名" value = "BeanValue"/>
    </jsp:useBean>

隐式对象

名称描述
application所有用户共享的信息
session用于保存用户的信息
request得到用户请求信息
response服务器向客户端回应的信息
page指当前页面转换为servlet后的实例
config服务器配置,可以取得初始化参数
excption表示jsp页面发生的异常,只有在错误页面才有用
out用于页面输出
pageContextjsp的页面容器,可以获得其他八个隐式对象。

EL&JSTL

EL

el可以在jsp中读取数据、执行运算、调用java方法和获取web开发常用对象。

语法

基本形式

${表达式}

运算符和其他编程语言类似

获取数据

获取变量的属性

  1. 点运算符(.)

    ${lisi.age}

  2. 中括号运算符([])

    主要用来访问属性名有特殊符号的变量

    ${lisi.["My-age"}

判断是否为空

${empty lisi.age}

为空则返回true,否则返回false

隐式对象

隐式对象名称描述
pageContext对应jsp页面的pageContext,可以通过它获取jsp隐式对象
applicationScopeapplication域中的map对象
sessionScopesession域中的map对象
requestScoperequest域中的map对象
pageScopepage域中的map对象
param所有请求参数的map对象
paramValue所有请求参数的map对象,返回String类型数组
header所有http请求头的map对象
headerValue所有http请求头的map对象,返回String类型数组
cookie使用者的cookie值,map类型
initParam保存了所有web应用初始化参数的map对象

JSTL

Core标签库

表达式标签
  • <c:out>:用来向页面输出信息

    <c:out value="vlaue" default="defaultValue">

    default属性用来指定value变量为null的情况下输出内容

  • <c:remove>:用来移除指定的jsp范围内的变量

    <c:remove var="name" scope="范围">

流程控制标签库
  • <c:if>

    语法

    <c:if test="布尔表达式" var="表达式名">

    var可省略

    示例

    jsp
    <c:if test="${user.name=="admit"}">
        ${user.name} is admit
    </c:if>
  • <c:choose><c:when><c:ontherwish>

    jsp
    <c:choose>
        
        <c:when test="${empty param.name}">
            unKnown user
        </c:when>
        
        <c:when test="${param.user=='admit'}">
        	${param.user} is admit
        </c:when>
        
        <c:ontherwish>
        	${param.user} is employee 
        </c:ontherwish>
        
    </c:choose>

    相当于if-else语法,当都不满足时执行<c:ontherwish>代码块

循环标签
  • <c:forEach>

    语法

    jsp
    <c:forEach var="变量名" items="集合变量名" begin="起始索引" end="结束索引" step="步长">
        TODO
    </c:forEach>

    begin、end、step可省略。起始索引从0开始。

    示例

    jsp
    <c:forEach var="user" items="${userList}">
        user.name
    </c:forEach>

数据库

JDBC

JDBC编程的6个开发步骤

  1. 加载并注册数据库驱动

    Class.forName("com.mysql.jdbc.driver");

  2. 使用DriverManager获取connection对象

    Connection connection = DriverManager.getConnection(url,user,password);

  3. 使用Connection获取Statement对象

    Statement statement = connection.createStatement();

  4. 使用Statement执行sql命令

    execute(String sql):可以执行任何命令

    executeQuery(String sql):执行查询命令

    executeUpdate(String sql):执行更新命令

  5. 处理ResultSet结果集

    ResultSet rs = statement.executeQuery(sql);

  6. 释放数据库连接

  • 使用预编译执行sql命令

    java
    // 定义sql语句
    String sql = "select * from user where name=? and password=?";
    // 预编译sql
    PrepareStatement ps = connection.prepareStatement(sql);
    // 给占位符?设置参数,从1开始
    ps.setString(1,"zhangsan");
    ps.setString(2,"zhang12345");
    // 执行sql命令
    ResultSet rs = ps.executeQuery();

数据库连接池

数据库连接池负责分配、管理和释放数据库连接,它运行应用程序重复使用现有的数据库连接,而不是重新创建;当其他应用程序需要连接数据库时,向数据库连接池发出申请,当使用完毕后,数据库连接池将回收connection以供其他线程使用,从而减少创建和断开数据库连接的次数,提高数据库的访问效率。