Servlet相关技术

Servlet相关技术

以前都是不用工具开发。开发比较麻烦,这里开始,把项目导入到idea里
项目导入IDEA里并开发

(1)导入工程

在这里插入图片描述

(2)新建src目录,方便以后开发servlet等java代码
在这里插入图片描述
(3)导入jar配置项目

​ ①配置java编译完放置路径,放在classes目录下

在这里插入图片描述

②导入tomcat的jar,
在这里插入图片描述
③编辑web.xml放的路径
在这里插入图片描述
④新增Airifacts

在这里插入图片描述

(4)部署tomcat
在这里插入图片描述
启动成功

在这里插入图片描述

Servlet的开发步骤
用xml配置Servlet

(1)在web.xml配置如下配置

    <!--配置servlet name-->
    <servlet>
        <!--相当于@WebServlet 的name属性-->
        <servlet-name>secondServlet</servlet-name>
        <!--指定servlet的实现类-->
        <servlet-class>com.servletdemo.SecondServlet</servlet-class>
    </servlet>
   <!-- 配置servlet url-->
    <servlet-mapping>
        <!--指定servletname-->
        <servlet-name>secondServlet</servlet-name>
        <!--指定servlet 指向的地址 相当于urlPatterns-->
        <url-pattern>/secondServlet</url-pattern>
    </servlet-mapping>

(2)开发

package com.servletdemo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 〈第二个servlet〉
 *
 * @author PitterWang
 * @create 2020/6/22
 * @since 1.0.0
 */
public class SecondServlet extends HttpServlet {

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      resp.sendRedirect("index.jsp");
   }
}
注解(Annotation)配置Servlet
package com.servletdemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 〈第一个Servlet〉
 *
 * @author PitterWang
 * @create 2020/6/22
 * @since 1.0.0
 */
@WebServlet(name = "firstServlet",urlPatterns = {"/firstServlet"})
public class FirstServlet extends HttpServlet {
   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      resp.sendRedirect("index.jsp");
   }
}

访问:http://localhost:8080/webDemo/firstServlet即可跳到index.jsp

@WebServlet的属性

属性名类型描述
nameStringservlet-name,如果没有显示指定,该Servlet的取值为全限定名
valueString[]等价于 urlPatterns 属性,与该属性不能同时使用
urlPatternsString[]指定Servlet url的匹配模式,等价于
loadOnStartupint指定Servlet的加载顺序
initParamswebInitParam[]指定初始化参数
asyncSupportedboolean是否支持异步操作
descriptionString描述
displayNameStringservlet显示名
Servlet生命周期
创建servlet的两个时机
(1)客户端第一次请求某个servlet的时候,系统创建servlet实例
(2)web应用启动时,立即创建servlet,load-on-startup Servlet
	配置的两种方法
	第一种:@WebServlet(name = "firstServlet",urlPatterns = {"/firstServlet"},loadOnStartup = 1)
	第二种:  
    <servlet>
        <!--相当于@WebServlet 的name属性-->
        <servlet-name>secondServlet</servlet-name>
        <!--指定servlet的实现类-->
        <servlet-class>com.servletdemo.SecondServlet</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
每个Servlet生命周期
(1)创建servlet实例
(2)web容器调用init方法,对servlet进行初始化
(3)servlet初始化之后,用于一直响应客户端请求。如果客户端发送Get请求,指向doGet方法,发送Post请求,指向doPost方法。或者统一使用service()响应用户请求
(4)web容器销毁时,调用destroy()方法。
Servlet获取配置文件
xml方式
 <servlet>
     <!--相当于@WebServlet 的name属性-->
     <servlet-name>secondServlet</servlet-name>
     <!--指定servlet的实现类-->
     <servlet-class>com.servletdemo.SecondServlet</servlet-class>
     <load-on-startup>2</load-on-startup>
     <init-param>
         <param-name>name</param-name>
         <param-value>王成东</param-value>
     </init-param>

 </servlet>
<!-- 配置servlet url-->
 <servlet-mapping>
     <!--指定servletname-->
     <servlet-name>secondServlet</servlet-name>
     <!--指定servlet 指向的地址-->
     <url-pattern>/secondServlet</url-pattern>
 </servlet-mapping>
package com.servletdemo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 〈第二个servlet〉
 *
 * @author PitterWang
 * @create 2020/6/22
 * @since 1.0.0
 */
public class SecondServlet extends HttpServlet {

   @Override
   public void init() throws ServletException {
      System.out.println("初始化");
      String name = getServletConfig().getInitParameter("name");
      System.out.println(name);
      super.init();
   }

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("调用");


      resp.sendRedirect("index.jsp");
   }

   @Override
   public void destroy() {
      System.out.println("销毁");
      super.destroy();
   }
}
注解
package com.servletdemo;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 〈第一个Servlet〉
 *
 * @author PitterWang
 * @create 2020/6/22
 * @since 1.0.0
 */
@WebServlet(name = "firstServlet",urlPatterns = {"/firstServlet"},loadOnStartup = 1,
initParams = {@WebInitParam(name="password",value = "1234")})

public class FirstServlet extends HttpServlet {

   @Override
   public void init() throws ServletException {
      System.out.println("first创建");
      String name = getServletConfig().getInitParameter("name");
      String password = getServletConfig().getInitParameter("password");

      System.out.println(name);
      System.out.println(password);
      super.init();
   }

   @Override
   protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      resp.sendRedirect("index.jsp");
   }
}
开发JSP2自定义标签库
jsp开发标签库需要如下几个步骤

(1)开发自定义标签处理类

继承SimpleTagSupport类,重新doTag()方法
package com.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.util.Date;

/**
 * 〈自定义标签类〉
 *
 * @author PitterWang
 * @create 2020/6/22
 * @since 1.0.0
 */
public class HelloTag extends SimpleTagSupport {
   @Override
   public void doTag() throws JspException, IOException {
      getJspContext().getOut().write("helloword" + new Date());
   }
}

(2)建立一个*.tld文件,每个*.tld文件对应对应一个标签库,每个标签库可包含多个标签库

<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">
    <tlib-version>1.0</tlib-version>
    <short-name>myshortname</short-name>
    <!--定义标签库的URL-->
    <uri>http://mycompany.com</uri>
    <tag>
        <!--定义标签名-->
        <name>helloword</name>
        <!--定义标签处理类-->
        <tag-class>com.tag.HelloTag</tag-class>
        <!--定义标签体为空-->
        <!--empty  标签只能作为空标签使用
        tagdependent  指定标签处理类自己负责处理标签体
        scriptless  指定该标签的标签体可以是静态HTML元素,表达式语言,当不允许jsp脚本
        JSP  指定该标签的标签体可以使用jsp脚本
        -->
        <body-content>empty</body-content>
    </tag>
</taglib>

(3)在jsp中使用自定义标签

jsp页面中确定指定的标签需要两点
(1)标签库uri:确定使用那个标签库
(2)标签名:确定使用那个标签
使用标签分为两个步骤
(1)导入标签库
(2)使用标签
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<%--导入标签库,指定mytag前缀的标签--%>
<%@ taglib uri="http://mycompany.com" prefix="mytag"%>
<html>
<head>
    <title>Hello</title>
</head>
<body>
    WELCOME
<br/>
    <%--使用标签,其中mytag是标签前缀,根据taglib的编译指令--%>
<mytag:helloword/>
</body>
</html>
使用有属性的标签

(1)开发自定义标签处理类

继承SimpleTagSupport类,重新doTag()方法
package com.tag;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;
import java.util.Date;

/**
 * 〈带属性的标签〉
 *
 * @author PitterWang
 * @create 2020/6/23
 * @since 1.0.0
 */
public class AttributeTag extends SimpleTagSupport {

   private String userName;
   private String passWord;

   public String getUserName() {
      return userName;
   }

   public void setUserName(String userName) {
      this.userName = userName;
   }

   public String getPassWord() {
      return passWord;
   }

   public void setPassWord(String passWord) {
      this.passWord = passWord;
   }

   @Override
   public void doTag() throws JspException, IOException {
      getJspContext().getOut().write("userName = " + userName + ",passWord = " + passWord);
   }
}

(2)建立一个*.tld文件,每个*.tld文件对应对应一个标签库,每个标签库可包含多个标签库

    <tag>
        <name>attribute</name>
        <tag-class>com.tag.AttributeTag</tag-class>
        <body-content>empty</body-content>


        <attribute>
            <!--配置标签属性名-->
            <name>userName</name>

            <!--设置属性是否为必须-->
            <required>true</required>

        <!--    设置属性是否支持sp脚本,表达式等动态内容-->
            <fragment>true</fragment>
        </attribute>
        <attribute>
            <name>passWord</name>
            <required>true</required>
            <fragment>true</fragment>
        </attribute>
    </tag>

(3)在jsp中使用自定义标签

<mytag:attribute userName = "dongdong" passWord="1234"/>
开发、配置Filter以及Filter的功能
1.Filter的作用
	1~在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest
	2~根据需要检查HttpServletRequest,也可以修改HttpServletRequest头和数据
	3~在HttpServletResponse到达客户端之前,拦截HttpServletResponse。
	4~根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据
2.Filter的几种种类
	1~用户授权的Filter
	2~日志Filter
	3~负责解码的Filter
	4~能改变XML内容的XSLT Filter
	5~Filter可以拦截多个请求或者响应
3.创建一个Filter步骤
	1~创建Filter处理类
	2~web.xml文件中配置Filter
4.Filter和Servlet配置和使用差不多

(1)创建Filter处理类

//实现javax.servlet.Filter接口,接口定义下面三个方法
package com.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * 〈拦截用户请求,把请求的信息记录到日志〉
 *
 * @author PitterWang
 * @create 2020/6/23
 * @since 1.0.0
 */
public class LogFilter implements Filter {

	//访问Filter的配置信息
	private FilterConfig config;

	/**
	 * 初始化方法
	 * @param filterConfig
	 * @throws ServletException
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		this.config = filterConfig;
	}

	@Override
	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

		ServletContext servletContext = this.config.getServletContext();

		long before = System.currentTimeMillis();
		System.out.println("开始过滤");

		HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;

		String servletPath = httpServletRequest.getServletPath();
		System.out.println("l拦截的地址 = "+servletPath);
		filterChain.doFilter(servletRequest,servletResponse);
		long aftet = System.currentTimeMillis();

		System.out.println("过滤结束");

		System.out.println("请求呗定位到" + httpServletRequest.getRequestURI() + "用时 "+ (aftet - before));
	}

	/***
	 * 销毁方法
	 */
	@Override
	public void destroy() {
		this.config = null;
	}
}

(2)两种配置方式

​ 1.注解方式配置

在Filter处理类上加注解
@WebFilter(filterName = "log",urlPatterns = {"/*"})

​ 2.web.xml方式配置

<filter>
    <filter-name>log</filter-name>
    <filter-class>com.filter.LogFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>log</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
开发、配置Listener以及Listener的功能
使用Listener进行监听只需要两个步骤
	1.定义Listener实现类
	2.通过注解或者xml文件中配置Listener

(1)实现Listener类

常用的事件监听接口
ServletContextListener:用于监听Web应用的启动和关闭
ServletContextAttributeListener:用于监听application内属性的改变
ServletRequestListener:监听用户请求
ServletRequestAttributeListener:监听request范围内属性的改变
HttpSessionListener:监听session的开始与结束
HttpSessionAttributeListener:静态session范围内的属性改变
package com.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebFilter;

/**
 * 〈Web应用启动和关闭监听〉
 *
 * @author PitterWang
 * @create 2020/6/23
 * @since 1.0.0
 */
/*@WebFilter*/
public class ConListener implements ServletContextListener {

   @Override
   public void contextInitialized(ServletContextEvent sce) {
      System.out.println("Web服务启动");
   }

   @Override
   public void contextDestroyed(ServletContextEvent sce) {
      System.out.println("Web服务关闭");

   }
}

(2)配置Listener

​ 方式一:注解方式

	在Listener处理类上加注解@WebFilter

​ 方式二:web.xml配置

<listener>
    <listener-class>com.listener.ConListener</listener-class>
</listener>

测试项目下载地址;https://github.com/wangchengdonggo/webDemo.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值