Servlet学习

概念

Servlet

1
Java  Servlet(Java服务器小程序)是一个基于Java技术的Web组件,运行在服务器端,它由Servlet容器所管理,用于生成动态的内容。  Servlet是平台独立的Java类,编写一个Servlet,实际上就是按照Servlet规范编写一个Java类。Servlet被编译为平台独立 的字节码,可以被动态地加载到支持Java技术的Web服务器中运行。

Servlet容器

1
Servlet容器也叫做Servlet引擎,是Web服务器或应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于  MIME的请求,格式化基于MIME的响应。Servlet没有main方法,不能独立运行,它必须被部署到Servlet容器中,由容器来实例化和调用  Servlet的方法(如doGet()doPost()),Servlet容器在Servlet的生命周期内包容和管理Servlet。在JSP技术 推出后,管理和运行Servlet/JSP的容器也称为Web容器。

Tomcat

1
2
3
4
5
6
7
Tomcat是一个免费的开放源代码的Servlet容器。
Tomcat服务器接受客户请求并做出响应的过程如下,与上图类似:
1)客户端(通常都是浏览器)访问Web服务器,发送HTTP请求。
2)Web服务器接收到请求后,传递给Servlet容器。
3)Servlet容器加载Servlet,产生Servlet实例后,向其传递表示请求和响应的对象。
4)Servlet实例使用请求对象得到客户端的请求信息,然后进行相应的处理。
5)Servlet实例将处理结果通过响应对象发送回客户端,容器负责确保响应正确送出,同时将控制返回给Web服务器。

tomcat目录结构

1
2
3
4
5
6
bin,用于存放Tomcat的各种配置文件,比如,web.xml、server.xml
lib,用于存放Tomcat服务器,和所有Web应用程序需要访问的JAR文件
logs,用于存放Tomcat的日志文件
temp,用于存放Tomcat运行时,产生的临时文件
webapps,Web应用程序的主要发布目录,通常将要发布的应用程序放到这个目录下
work,Tomcat的工作目录,JSP编译生成的Servlet源文件,和字节码文件放在这个目录下

idea tomcat部署过程

https://blog.csdn.net/qq_28513801/article/details/92838236

servlet

什么是servlet?

本质上就是一个运行在web容器(web服务器中)的java类,tomcat是web容器中的一个。

作用:

1
用于处理用户的请求并作出响应

servlet与普通的java程序的区别:

1
2
3
4
1.本质上就是一个java类
2.所有的servlet必须实现接口:Servlet
3.运行Tomcat中,web容器中
4.对用户的请求进行处理,并且做出响应

编写步骤:

1
2
3
1.创建一个继承于HttpServlet的类(HttpServlet实现了Servlet接口)
2.重写doGet或doPost方法,分别用来处理浏览器提交的get或post请求
3.配置webapp/WEB-INF/web.xml 文件,配置Servlet 的访问地址。

配置Servlet

写好的Serlvet保存在src目录中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.example.myServlet;

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

public class DemoServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer=resp.getWriter();
writer.println("<h1 style='color:red'>11111</h1>");
}

}

在WEB-INF/web.xml中配置servlet-mapping和servlet-name

访问效果

servlet生命周期

一个servlet只会在tomcat容器中实例化一次,且只会产生一个对象,常驻内存,要等到服务器关闭才会销毁。tomcat对它做了多线程处理,这样才能实现一个对象多个请求

init:

1
初始化方法,用户第1次访问的时候会执行1次

service :

1
处理服务请求的方法,每次请求都会执行

destory:

1
销毁方法,服务器关闭的时候执行1次

继承Servlet类并重写三个方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.example.myServlet;

import javax.servlet.*;
import java.io.IOException;

public class ServletDemo implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException{
System.out.println("init");
}

@Override
public ServletConfig getServletConfig(){
return null;
}

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException{
System.out.println("service");
}

@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy(){
System.out.println("destroy");
}


}

访问页面后,可以看到执行了service方法

ServletConfig接口

在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<servlet>
<servlet-name>mytest</servlet-name>
<servlet-class>com.example.myServlet.ConfigServlet</servlet-class>

<init-param>
<param-name>name</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mytest</servlet-name>
<url-pattern>/mytest</url-pattern>
</servlet-mapping>

getInitParameter(“参数”) 通过参数名,得到文件中参数值

getInitParameterNames() 得到所有参数名字

tomcat在创建Servlet实例时会自动把上面的初始化参数封装对ServletConfig对象中,并在调用init方法时,把ServletConfig对象传递给servlet。通过ServletConfig对象就可以得到当前servlet的初始化参数信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
package com.example.myServlet;

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

public class ConfigServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer=resp.getWriter();
String name=getInitParameter("name");

writer.println(name);

Enumeration initParameterNames=getInitParameterNames();

while (initParameterNames.hasMoreElements()){

String element= (String) initParameterNames.nextElement();
String value=getInitParameter(element);
writer.println("参数名:"+element+"值:"+value);
}
}
}

成功获取到了配置的信息

HttpServletRequest 对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.example.myServlet;

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

public class HttpServletRequestDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
response.setContentType(("text/html;charset=utf-8"));
PrintWriter writer=response.getWriter();

writer.println(request.getMethod()); //请求方式
writer.println(request.getRequestURI()); //请求URL
writer.println(request.getProtocol()); //请求协议
writer.println(request.getQueryString()); //查询字符
writer.println(request.getHeader("user-agent")); //获取UA

}
}

效果

BeanUtils

BeanUtils是apache commons 组件的成员之一,用于简化javaBean封装数据的操作。也就是说可以简化获取参数的方式

先导入包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package com.example.myServlet;

import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

class User{
private String name;
private String sex;
private int age;

}

public class HttpServletRequestDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(("text/html;charset=utf-8"));
PrintWriter writer = response.getWriter();

Map parameterMap = request.getParameterMap();
User user = new User();
try{
BeanUtils.populate(user,parameterMap);
}catch (IllegalAccessException e){
e.printStackTrace();
}catch (InvocationTargetException e){
e.printStackTrace();
}
writer.println(user);
}
}

作用域

sevlet中的请求会根据作用域的范围分为请求域、会话域、上下文域

1
2
3
请求域:一个用户的一次请求
会话域:一个用户的所有请求
上下文域:所有用户的所有请求

范围大小

1
请求域 < 会话域 < 上下文域

作用域存值

1
setAttritube("键",“值”) 

取值

1
getAttritube("键") 

删除

1
removeAttritube("键")

转发

实现页面跳转,从一个servlet跳转到另一个servlet

1
2
3
4
5
6
7
8
9
public class HttpServletRequestDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(("text/html;charset=utf-8"));
RequestDispatcher requestDispatcher=request.getRequestDispatcher("demo");
requestDispatcher.forward(request,response);
}
}

跳转到demo

转发的特点:

1
2
3
4
1.地址栏不会发生变化,显示的还是上一个servlet的地址
2.一共只有一次请求:请求不断链
3.请求域中数据不会丢失:还是要满足请求不断链。
4.转发中,是一次请求的

重定向

1
2
3
4
5
6
public class HttpServletRequestDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("demo");
}
}

效果

重定向的特点:

1
2
3
4
1.地址栏:有变化,显示新的地址
2.2次请求
3.请求域中的数据:断链就数据丢失了
4.重定向的根目录是:http://localhost:8080/不包含项目的访问地址

HttpServletResponse

设置响应的状态码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.myServlet;

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

public class ResponseDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(200);
}
}


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!