创建一个Servlet
Servlet是在服务器上运行的小程序,一个Servlet就是一个Java类,并且可以通过“请求-响应”的编程模型来访问这个驻留在服务器内存中的Servlet程序。

1.创建一个Servlet 接口的实现类
1)新建一个Dynamic Web Project 文件
2) 新建一个包 在包内新建一个java类
实现一个接口 implements
public class HelloServlet implements Servlet
Servlet+Alt+/ 引入文件
点击 HelloServlet Add unimplemented methods
package com.lijian.javaweb;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class HelloServlet implements Servlet{
@Override
public void destroy() {
System.out.println("destroy...");
}
@Override
public ServletConfig getServletConfig() {
System.out.println("getServletConfig...");
return null;
}
@Override
public String getServletInfo() {
System.out.println("getServletInfo...");
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init...");
}
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("servlet...");
}
public HelloServlet() {
System.out.println("HelloServlet...");
}
}
public class HelloServlet implements Servlet
2.在web.xml文件中配置和映射这个Servalet
引入文件 Ctrl + Shift + F
如果报错
cvc-complex-type.2.3: Element 'web-app' cannot have character [children], because the type's content type is element- only.
出错原因为xml头文件中第三行: xmlns="http://java.sun.com/xml/ns/javaee" 改成javaee改为j2ee后解决问题。
<!--配置和映射Servlet-->
<servlet>
<!--Servlet注册的名字-->
<servlet-name>HelloServlet</servlet-name>
<!--Servlet的全类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--需要和某一个Servlet 节点的 serlvet-name子节点的文本节点一致-->
<servlet-name>HelloServlet</servlet-name>
<!--映射具体的访问路径:、代表当前WEB应用的根目录-->
<url-pattern>/servlet/HelloServlet</url-pattern>
</servlet-mapping>
3.Swevlet 容器 : 运行Servlet/jsp/filter等软件环境
1). 可以创建servlet 并调用servlet的相关生命周期方法.
2).JSP,Filter,Listener,Tag...
4.Servlet 生命周期的方法:以下方法都是由servlet 容器负责调用
1).构造器:只被调用一次,只有第一个请求servlet 时,创建servlet 的实列,调用构造器.
说明servlet 的是单实例! (不推荐使用全局变量 ,修改全局变量会有问题)
2).init方法:只被调用一次.创建好实列后立即被调用,用于初始化当前的servlet.
3).service:被多次调用 每次请求都会调用servelet 方法.实际用于响应请求.
4).destroy:只被调用一次,在当前servlet 所在的WEB应用被卸载前调用 用于释放当前servlet所在用的资源
5).load-on-startup 参数:
1> 配置在servlet 节点中
<servlet>
<!--Servlet注册的名字-->
<servlet-name>HelloServlet</servlet-name>
<!--Servlet的全类名-->
<servlet-class>servlet.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
2>load-on-startup: 可以指定servlet 被创建的时机 ,若为负数 则在第一次请求时被创建
若为正数,则在当前WEB应用被Servlet容器加载创建实列,且数组越小越早被创建
6. servlet - mapping
1> 同意servelt 被映射到多个<servlet - mapping>元素的<servlet-name>子元素的设置值可以是同一个Servlet的注册名
2>servlet映射到URL中也可以*通配符,但只能有两种固定队的格式 (*.扩展名,/*)
<servlet - mapping>
<servlet-name></servlet-name>
<url-pattern>/*</url-pattern>
</servlet - mapping>
OR
<servlet - mapping>
<servlet-name></servlet-name>
<url-pattern>*.do</url-pattern>
</servlet - mapping>
一下不合法
<servlet - mapping>
<servlet-name></servlet-name>
<url-pattern>/*.do</url-pattern>
</servlet - mapping>
7.ServletConfig:封装了Servlet的配置信息,并且可以获取ServletContext对象
1)获取初始化参数
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>test.HelloWorld</servlet-class>
<!-- 配置Servlet的初始化参数,节点必须在load-on-startup节点前面-->
<init-param>
<!-- 初始化参数名 -->
<param-name>user</param-name>
<!-- 初始化参数值 -->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1230</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
2)获取初始化参数:
> getInitParameter(String name):获取指定参数名的初始化参数
> getInitParameterNames():获取参数名组成的Rnumberation 对象
String user= servletConfig.getInitParameter("user");
System.out.println("user:"+user);
Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()) {
String name = names.nextElement();
String value=servletConfig.getInitParameter(name);
System.out.println("~~:"+name+":"+value);
}
3). 获取Serlvelt 的配置名称
String servletName = servletConfig.getServletName();
8. ServletContext
1>可以由ServletConfig获取
2>对该对象代表当前WEB应用:可以认为ServletContext 是当前WEB应用的大管家,可以获取当前WEB应用的各个信息。
1.获取当前WEB应用的初始化参数
设置初始化参数:可以为所有Servlet说获取,而Servlet的初始化参数只用的那个Servlet 可以获取
<!-- 配置当前WEB应用的初始化参数 -->
<context-param>
<param-name>driver</param-name>
<param-value>lijian</param-value>
</context-param>
方法:
getInitParameter
getInitParameterNames
代码
//获取servletContext对象
ServletContext servletContext = servletConfig.getServletContext();
String driver = servletContext.getInitParameter("driver");
System.out.println("driver:"+driver);
Enumeration<String> names2 = servletContext.getInitParameterNames();
while(names2.hasMoreElements()) {
String name = names2.nextElement();
System.out.println("-->"+name);
}
2.获取当前WEB应用的某一个文件的绝对路径:服务器上的绝对路劲,而不是部署前的路劲
getRealPath(String path);
代码:
String realPath = servletContext.getRealPath("/note.txt");
System.out.println(realPath);
3.获取当前WEB应用的名称
getContextPath()
代码
String contextPath = servletContext.getContextPath();
4.获取当前WEB应用的某一文件对应的输入流
getResourceAsStream(String path);path 的/为当前WEB应用的根目录、
代码
ClassLoader classLoader = getClass().getClassLoader();
InputStream is = classLoader.getResourceAsStream("");
InputStream is2 = servletContext.getResourceAsStream("");
5、和attribute 相关的几个方法:
九 GET和POST请求:
1> 使用GET请求获取参数:
(1).在浏览器地址栏输入某个URL地址或单机网上一个超链接时,浏览器发出的HTTP请求消息的请求方式为GET请求
(2).如果网页中的<from>表单元素method设置为GET,浏览器提交FORM表单生成的HTTP请求为GET
(3).使用GET请求方式给WEB服务器传递参数的格式:
https://i-beta.cnblogs.com/articles?cateId=1651910
(4).使用GET方式传递的数据量一般控制在1KB一下
2>. 使用POST方式传递参数,
(1).主要用于向WEB服务器提交FORM表单中的数据: form 表单中method 设置为post
(2).POST方式将各个表单字段元素及数据作为HTTP消息请求的实体内容发送给WEB服务器,传递的数据量要比使用GET传递数据量大得多
请求体中参数
十 如何在servlet中获取信息
1>. servlet的service()方法用于应答请求:因为每次请求都会调用service()方法
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("servlet...");
}
ServletRequest :封装请求信息,可以重中获取到任何请求信息
ServletResponse:封装响应信息,如果想给用户什么响应,具体可以使用该接口方法实现
这两个接口的实现类都是服务器实现的,并在服务器调用service方法时传入
2>.ServletRequest:
(1).获取请求参数
> String getParameter(String name):根据请求参数的名字,返回参数值
如果请求对象有多个值(checkbox) 该方法只能获取第一个提交的值
> String[] getParameterValues(String name):根据请求参数的名字,返回请求参数的字符串数组
> Enumeration getParameterNames():返回参数名对应的 Enumeration 对象,类似于 servletConfig(或servletContext)
> Map getParameterMap():返回参数名对应的键值对,KEY:键, value:值 String 数组类型
Map<String, String[]> map = request.getParameterMap();
for(Map.Entry<String, String[]> entry: map.entrySet()) {
System.out.println(entry.getKey()+Arrays.asList(entry.getValue()));
}
(2)获取请求的请求方式URI
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestURI = httpServletRequest.getRequestURI();
System.out.println(requestURI);
(3)获取请求的URL
String method = httpServletRequest.getMethod();
System.out.println(method);
(4)获取请求的字符串 GET post(null)
String queryString = httpServletRequest.getQueryString();
System.out.println(queryString);
(5)获取servlet的映射路径
String servletPath = httpServletRequest.getServletPath();
System.out.println(servletPath);
(6) 和attribute 相关的几个方法:
3> HttpServletRequest :是ServletRequest的子接口 , 针对HTTP请求说定义,里面包含了大量的获取HTTP请求相关的方法.
4> ServletResponse:封装响应信息,如果想给用户什么响应,具体可以使用该接口方法实现
(1). getWriter():返回PrintWroter对象。调用该对象的print()方法,將把print()中的参数打印到客户的浏览器上
代码
// 实际的逻辑是在这里
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
(2).设置响应的类型
代码
// 设置响应内容类型
response.setContentType("application/msword");
(3).void sendRedirect(String location):请求的重新定向(此方法为HttpServletResponse中定义)
-----------------------------------------------------------------
在web.xml文件中设置两个web应用初始化参数, user password。
定义一个 login.html.里面定义两个请求字段:user ,password
在创建一个LoginServlet.在其中获取请求:user ,password
对比期和web.xml文件中定义的请求参数是否一致
若一致,响应Hello:xx,若不一致,响应Sorry:xxx 为user
--------------------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="loginServlet" method="post">
user:<input type="text" name="username"/>
password:<input type="password" name="password"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<!-- 配置当前WEB应用的初始化参数 -->
<context-param>
<param-name>user</param-name>
<param-value>admin</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>lijian</param-value>
</context-param>
<servlet>
<servlet-name>loginServlet</servlet-name>
<servlet-class>com.lijian.javaweb.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>loginServlet</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>
</web-app>
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // 1. 获取请求参数:username,password String username = request.getParameter("username"); String password = request.getParameter("password"); // 2. 获取当前WEB应用的初始化参数username,password //获取使用ServletContext对象 // ServletContext servletContext = getServletConfig().getServletContext(); // // String initUser = servletContext.getInitParameter("user"); // String initPassword = servletContext.getInitParameter("password"); String initUser = getServletContext().getInitParameter("user"); String initPassword = getServletContext().getInitParameter("password"); // 3. 比对 PrintWriter out = response.getWriter(); if(initUser.equals(username) && initPassword.equals(password)) { out.print("Hello:"+username); }else { out.print("Sorry:"+username); } // 4. 打印响应字符串. }

浙公网安备 33010602011771号