前言:
Serlet是什么?
Servlet是服务端的小组件是一门动态获取页面资源的技术,是Java语言编写的一个类,Servlet运行在Web服务器中,他是由服务端调用以及执行的,学号Servlet是非常有必要的,Servlet是MVC的基石。
Servlet的快速入门
1 编写一个Java类去实现核心接口Servlet即可(要重写Servlet中的五个方法)
package servlet;
import javax.servlet.*;
import javax.servlet.Servlet;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @author 三月水
* version 0.5
*/
@WebServlet("/dem1")//配置访问路径(精准匹配)
public class HelloServlet implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init().....");
}
public ServletConfig getServletConfig() {
return null;
}
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello Servlet");
}
public String getServletInfo() {
return null;
}
public void destroy() {
System.out.println("destroy()....");
}
}
2 在pom.xml中导入Servlet相关的依赖包,Servlet3.0之后支持注解开发(通过注解的方式来访问)
3 在init()和servise()方法中写入自己的逻辑
4 配置@WebServlet("/xxx")//配置访问名(精准匹配)
5 启动Web服务器
填写刚刚在@WebServlet("/xxx")中填入的访问名访问即可
访问结果
Servlet生命周期
实现核心接口Servlet会重写5个方法其中三个是关于生命周期的方法
1. init(); 初始化阶段//客服端浏览器第一次访问Servlet时,Web服务器会调用init()完成对Servlet的初始化2. service() 处理浏览器请求阶段// 客户端浏览器每一次访问请求Servlet时,Web服务器会调用Servlet中的Servise()对请求进行处理3. destroy()终止阶段//Web服务器关闭或者是重启会调用该方法对Servlet进行销毁
HttpServlet
在实际发开中往往会继承该类对Servlet进行开发
演示案列
1 编写一个类去继承HttpServlet
2 重写doGet 和 doPost方法 并且加上自己的逻辑
3 用注解的方式配置访问名(@WebServlet("/xxx"))
package servlet;/**
* @author 三月水
* version 0.5
*/
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo11")//用注解的方式访问
public class Servlet extends HttpServlet {//继承该类重写核心方法
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet....");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost....");
}
}
4 运行Web服务器在url中输入注解中的访问名(默认是get)
IDEA中开发Servlet
在开发当中Servlet是经常会使用到的,手动的编写效率不高且繁琐,IDEA中有个模板我们可以设置下,就可以不用每次都手动敲了
点击应用确定就完成了
每次我们需要对Servlet开发时只需点击这个输入你的类名确认即可
Servlet urlPattern 配置
注解的访问种类
1 精准匹配
@WebServlet("/demo1") ;//url路径也必须与访问名一致才能访问到 不然会报404异常
2 扩展名匹配
@WebServlet("/xxx.jar") ;//url路径写以.jar结尾的访问名都可访问该资源
3 目录匹配
@WebServlet("/ok / * ") ;//url路径写/ok/xxx都可以访问到该资源
4 任意匹配
@WebServlet("/ ") ;//url路径写任意的都可以访问该资源
@WebServlet("/ *") ;//url路径写任意的都可以访问该资源
小结 :
HttpServletRequest
核心对象 是对客户端请求的处理
常用的方法
1 getMehod() ; //获取请求方式
2 getParament() ; //获取请求参数
3 getParamentValue() ; //获取请求参数数组(多个值)
4 getParamentMap() ; //通过集合Map获取请求参数
5 getHeader() ; //获取请求头
6 getRequstURL() ; //获取请求路径(绝对路径)
7 getContextURL() ; //获取虚拟路径
8 setAttribute(key,value) ; //设置域数据
9 getAttribute(key) ; //获取域数据
Request请求参数乱码问题
post请求的处理:
在获取参数前
request.setCharacterEncoding("utf-8");//设置字符集
get请求参数的处理相对post要复杂 主要的流程
1 获取参数前进行URL编码,获取参数后进行解码 即可
String name = "张三" ;
1 进行URL编码
String encode = URLEncoder.encode(name, "utf-8");
2 进行URL解码
String decode = URLDecoder.decode(encode, "utf-8");
请求转发
核心的方法
request.getRequstDisparcher("访问名").forward(request,response);
//获取请求转发核心对象
setAttribute(key,value);//设置域数据getAttribute (key); //获取域数据removeAttribute();删除域数据
快速上手
1 编写两个Servlet类继承HttpServlet 重写对应的两个核心方法(doGet和doPost)
2 用注解的方式访问
package servlet;/**
* @author 三月水
* version 0.5
*/
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo33")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("ab","管理员");//设置共享数据
//编写请求转发核心方法
request.getRequestDispatcher("demo44").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
package servlet;/**
* @author 三月水
* version 0.5
*/
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo44")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Object ab = request.getAttribute("ab");//获取共享数据
System.out.println("ab :" + ab);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
2 启动Web服务器输入访问名demo33即可
小结:
为什么需要请求转发?请求转发在一次会话一次请求中共享同一个域的数据,url访问地址不变,不能访问当前 Web 工程外的资源。
HttpServletResponse
对客服端的请求进行响应
向客户端返回数据的方法
getOutpuStream();//处理二进制文件(照片,音频,视频)
getWriter();//处理纯文本
演示案例
package servlet;/**
* @author 三月水
* version 0.5
*/
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/demo21")
public class Response 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.print("<h1 > Hello Word ~ </h1>");
writer.print("hello Response.....");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
启动web服务器url中写入访问名回车即可 输出结果
请求重定向
核心方法response.getsendRedirect("url" );
package servlet;/**
* @author 三月水
* version 0.5
*/
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo55")
public class ServletDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("demo66");//重定向
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package servlet;/**
* @author 三月水
* version 0.5
*/
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/demo66")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("重定向.....");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
输出结果
小结:
请求重定向多用于网站迁移,一次会话两次请求中不可共享域(Request域)中数据,可以重定向至web工程外的资源。
请求转发和请求重定向的区别
请求转发:一次会话一次请求中共享域中的数据,浏览器url地址栏不会改变,只能转发服务器内部资源
请求重定向:一次会话二次请求不能共享域中的数据 ,浏览器url地址栏发生改变,可以重定向任意位置的资源(服务器内外部皆可)。