servlet构造器
servlet对象的创建分为两种:
-
延迟加载(默认)
服务器第一次接收到请求访问servlet时,会根据url查找对应的
servlet-name
,然后再根据servlet-name
找到对应的servlet-class
,找到之后,调用该servlet对象的无参构造器进行构造。 -
立即加载
在服务器一启动就将调用servlet的无参构造器构建对象。
package com.lzyy.servlet.day02;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class DemoLoad2Servlet extends GenericServlet {
public DemoLoad2Servlet() {
System.out.println("DemoLoad2Servlet被加载");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
运行结果:
xml配置:
<servlet>
<servlet-name>load2</servlet-name>
<servlet-class>com.lzyy.servlet.day02.DemoLoad2Servlet</servlet-class>
<!-- 延迟 -->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>load2</servlet-name>
<url-pattern>/load2</url-pattern>
</servlet-mapping>
<load-on-startup>整数</load-on-startup>
:
- 负整数:延迟加载
- 正整数或者0:立即加载
- 值越小越先被加载,0最先被加载
控制servlet对象是延迟加载还是立即加载方式是在
web.xml
中配置servlet时添加一个配置选项<load-on-startup>
单例模式
单例模式特点:
- 单例模式
instance
必须是static
的 getInstance
是静态的方法- 构造函数必须设置为私有函数
public class Singleton {
/**
* 创建对象:私有化 --> 只能自己使用
* static --> 类加载时,加载static,只加载一次
* 构造器私有化 --> 保证在该类外部,无法通过new的方式来创建对象实例
*
*/
private static Singleton s = new Singleton();
private Singleton() {}
//公有的访问单例实例的方法
public static Singleton getInstance() {
return s;
}
}
初始化
package com.lzyy.servlet.day02;
import java.io.IOException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class DemoLoad2Servlet extends GenericServlet {
public DemoLoad2Servlet() {
System.out.println("DemoLoad2Servlet被加载");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
}
@Override
public void init(ServletConfig config) throws ServletException {
String servletName = config.getServletName();
System.out.println(servletName);
}
}
运行结果:
DemoLoad2Servlet被加载
load2
公共接口ServletConfig:
ServletConfig
:servlet容器使用的servlet配置对象,用于在初始化期间将信息传递给servlet。
- 方法总结:
修饰符和类型 | 方法 | 说明 |
---|---|---|
String | getInitParament(String name) | 获取具有给定名称的初始化参数的值。 |
Enumeration<String> | getInitParamentNames() | 以字符串对象的枚举形式返回servlet的初始化参数的名称,如果servlet没有初始化参数,则返回空枚举。 |
ServletContext | getServletContext() | 返回对调用方,正在执行的ServletContext的引用。 |
String | getServletName() | 返回当前servlet实例的名称。 |
package com.lzyy.servlet.day02;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class DemoLoadServlet implements Servlet {
ServletConfig config;
public DemoLoadServlet() {
System.out.println("DemoLoadServlet被创建");
}
/**
* 当然容器监测到一个servlet从服务中被移除时,
* 容器调用该方法,释放资源
*/
@Override
public void destroy() {
System.out.println("释放资源");
}
/**
* 获取当前servlet对象的配置
*/
@Override
public ServletConfig getServletConfig() {
// 将init的config写成全局变量
return config;
}
// 获取servlet相关信息
@Override
public String getServletInfo() {
return config.getServletName();
}
/**
* 初始化的时候回调用
*/
@Override
public void init(ServletConfig config) throws ServletException {
this.config = config;
// 获取servlet名字
String servletName = config.getServletName();
System.out.println(servletName);
// 获取初始化参数根据参数名
String version = config.getInitParameter("version");
System.out.println(version);
// 获取所有的参数名
Enumeration<String> en = config.getInitParameterNames();
while (en.hasMoreElements()) {
String name = en.nextElement();
String value = config.getInitParameter(name);
System.out.println(name + "====" + value);
}
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("nice to miss you ");
}
}
<servlet>
<servlet-name>loadOne</servlet-name>
<servlet-class>com.lzyy.servlet.day02.DemoLoadServlet</servlet-class>
<!-- 配置初始化参数,没有特殊要求, 所有你想在创建Servlet对象时即传递给该Servlet的参数都可以卸载这里 -->
<init-param>
<param-name>version</param-name>
<param-value>1.0</param-value>
</init-param>
<init-param>
<param-name>author</param-name>
<param-value>adam</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>loadOne</servlet-name>
<url-pattern>/loadOne</url-pattern>
</servlet-mapping>
运行结果:
注解配置
package com.lzyy.servlet.day02;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletConfig;
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;
/**
* 对于一个servlet基于注解方式的配置与xml文件的配置 只能二选一
* 默认直接写当前那servlet的url-patten 此时的servlet-name就是全限定类名
* @author ASUS
*
*/
//@WebServlet("/ann")
// @WebServlet(name="ann",urlPatterns = {"/ann","/annotation"})
public class AnnotationSevlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println(config.getServletName());
//获取全部的参数名
Enumeration<String> en = config.getInitParameterNames();
while (en.hasMoreElements()) {
String name = en.nextElement();
String value = config.getInitParameter(name);
System.out.println(name + " == " + value);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// doPost(req, resp);
System.out.println("hello world");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("do post");
}
}
运行结果:
ann
author == adam
version == 1.0
hello world
@WebServlet
:
属性名 | 类型 | 描述 |
---|---|---|
name | String | 指定Servlet 的 name 属性,等价于<servlet-name> 。如果没有显式指定,则该Servlet 的取值即为类的全限定名。 |
value | String[] | 该属性等价于urlPatterns 属性。两个属性不能同时使用 |
urlPatterns | String[] | 指定一组Servlet 的 URL 匹配模式。等价于<url-pattern> 标签 |
loadOnStartup | int | 指定Servlet的加载顺序,等价于<load-on-startup> 标签。 |
initParams | WebInitParam[] | 指定一组Servlet初始化参数,等价于<init-param> 标签 |
asyncSupported | boolean | 声明Servlet是否支持异步操作模式,等价于<async-supported> 标签 |
description | String | 该Servlet的描述信息,等价于<description> 标签 |
displayName | String | 该 Servlet的显示名,通常配合工具使用,等价于<display-name> 标签 |
上面的代码还可以写成:
@WebServlet("/ann")
@WebServlet(name="ann",urlPatterns= {"/ann","/annotation"})
@WebServlet(name="ann",urlPatterns= {"/ann"},initParams= {@WebInitParam(name="version",value="1.0"),@WebInitParam(name="author",value="adam")})
@WebServlet(name="ann",urlPatterns= {"/ann"},initParams= {@WebInitParam(name="version",value="1.0"),@WebInitParam(name="author",value="adam")},loadOnStartup=0)
servlet获取请求参数
创建一个servlet类的,会默认生成代码
修改doget()
里面的代码
package com.lzyy.servlet.day02;
import java.io.IOException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class ParmServlet1
*/
@WebServlet("/ParmServlet1")
public class ParmServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ParmServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求的编码
request.setCharacterEncoding("utf-8");
// 通过参数名获取参数值
String username = request.getParameter("username");
// 获取所有的参数名
Enumeration<String> en = request.getParameterNames();
while (en.hasMoreElements()) {
String pname = en.nextElement();
// 如果获取的是一个多值参数的参数值,默认获取第一个
String pvalue = request.getParameter(pname);
System.out.println(pname + " == " + pvalue);
}
//获取所有的参数的map集合
Map<String, String[]> map = request.getParameterMap();
Set<Entry<String, String[]>> set = map.entrySet();
for (Entry<String, String[]> entry : set) {
for (String v : entry.getValue()) {
System.out.println(entry.getKey()+" === "+v);
}
}
// 获取多值参数的参数值
String[] strings = request.getParameterValues("hobby");
System.out.println(Arrays.toString(strings));
// 获取的必须是get请求的参数字符串
String string = request.getQueryString();
System.out.println(string);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
所有发送的请求都会被封装在Request对象中,所以想要获取请求相关的信息都从Request中获取
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
<!-- 表单提交的时候 action属性后面的/表示
ip:port-->
<form action="param" method="post">
<div>
<label>姓名</label> <input name="username" type="text">
</div>
<div>
<label>密码</label> <input name="password" type="password">
</div>
<div>
<label>年龄</label> <input name="age" type="text">
</div>
<div>
<label>电话</label> <input name="tel" type="text">
</div>
<div>
<label>性别</label> <input name="gender" type="radio" value="女">女
<input name="gender" type="radio" value="男">男
</div>
<div>
<label>地址</label> <select name="address">
<option value="北京">北京</option>
<option value="上海">上海</option>
<option value="广东">广东</option>
<option value="宁夏">宁夏</option>
</select>
</div>
<div>
<label>爱好</label> <input type="checkbox" name="hobby" value="篮球">篮球
<input type="checkbox" name="hobby" value="足球">足球 <input
type="checkbox" name="hobby" value="乒乓球">乒乓球 <input
type="checkbox" name="hobby" value="羽毛球">羽毛球 <input
type="checkbox" name="hobby" value="铅球">铅球
</div>
<div>
<button type="submit">注册</button>
<button type="reset">清空</button>
</div>
</form>
<a href="demo">点我看信息</a>
<img alt="走丢了" src="img/t.png">
<script type="text/javascript" src="js/param.js"></script>
</body>
</html>
获取请求参数的方法:
- 接受单一值参数的value:
request.getParameter(String ParamName)
- 获取多值参数的values:
request.getParameterValues(ParamName)
- 获取所有参数名和参数值的映射:
request.getParameterMap()
- 获取所有请求参数的名字:
request.getParameterNames()
- get方式的请求,可以获取url后边跟所有的请求参数的字符串:
request.getQueryString()
servlet跳转
跳转有两种方式:
- 服务器内部跳转:
主要借助RequestDispatcher
※ 获取RequestDispatcher
的方式 :由服务器在执⾏完⼀个servlet之后,在继续访问下⼀个资源
1.req.getRequestDispatacher(path)
2.servletContext.getRequestDispatcher(String path)
※ 通过RequestDispatcher
进行跳转的方式 :
1.forward(request,response)
:会清空response里边的信息
2.inclue(request,response)
:不会清空,⽽是将要跳转到的资源的信息包含到当前response⾥边
所以是先获取,后使用
@WebServlet("/ForwardServlet"):
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取RequestDispatcher 的两种方式
// 通过request直接获取
// RequestDispatcher rd = request.getRequestDispatcher("WEB-INF/Demo.html");
//通过RequestDispatcher 发生跳转 并且清空当前响应的信息
// rd.forward(request, response);
// 通过servletcontext获取RequestDispatcher
// 先获取servletcontext
ServletContext servletContext = request.getServletContext();
RequestDispatcher rd = servletContext.getRequestDispatcher("/WEB-INF/Demo.html");
// 携带着当前的响应信息去做跳转
rd.include(request, response);
}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<img src="img/t.png">
<h1>hello</h1>
</body>
</html>
运行结果:
类似于:
-
重定向:由服务器返回给客户端浏览器⼀个地址,由客户端再发起⼀次请求,这个过程也是⾃动完成的
主要是使用:
response.sendRedirect(path)
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("welcom to servlet");
// 重定向
response.sendRedirect("ForwardServlet");
}
类似于: