Servlet

Servlet初识

a.servlet是JavaEE规范之一,规范就是接口
b.servlet是JavaWEB三大组件之一
-servlet
-filter 过滤器
-listener 监听器

手动实现Servlet程序

a.实现接口

public class MyServlet implements Servlet {
    public void init(ServletConfig config) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

b.配置

 <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.controller.servlet.MyServlet</servlet-class>
    </servlet>
    <!--配置servlet访问地址-->
   <servlet-mapping>
       <servlet-name>myServlet</servlet-name>
       <!--工程路径下,Servlet访问地址-->
       <url-pattern>/</url-pattern>
   </servlet-mapping>

Servlet访问流程

a.浏览器发送请求
b.tomcat监听端口
c.访问对应工程路径
d.检查web.xml配置,找到对应的类
e.执行service代码

 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {

    }

Servlet生命周期

1.执行构造方法
2.执行init函数
3.执行Service
4.停止服务执行销毁释放资源

public class MyServlet implements Servlet {
    public MyServlet() {
        System.out.println("执行构造函数!");
    }
    public void init(ServletConfig config) throws ServletException {
        System.out.println("执行初始化!");
    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        System.out.println("执行Service方法!");
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {
        System.out.println("执行销毁方法");
    }
}

在这里插入图片描述
在这里插入图片描述

Servlet请求分发

1.继承Servlet接口

 public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
 		//类型转换
        HttpServletRequest httpServletRequest = (HttpServletRequest)req;
        if (httpServletRequest.getMethod().equals( "GET")) {
            System.out.println("GET!");
            doGEt();
        } else {
            System.out.println("POST!");
            doPost();
        }
    }
 public void doGEt() {};
 public void doPost() {};

2.实现HttpServlet

public class MyHttpServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // get逻辑
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // post逻辑
    }
}

3.使用IDEA快速创建
1.右键包名
在这里插入图片描述

Servlet类体系

a.Servlet 定义访问规范
b.GenericServlet 做了一些空实现
c.HttpServlet 请求分发处理,并抛出异常源码如下

 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException
    {
	String protocol = req.getProtocol();
	String msg = lStrings.getString("http.method_get_not_supported");
	if (protocol.endsWith("1.1")) {
	    resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
	} else {
	    resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
	}
    }
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException
    {
	String protocol = req.getProtocol();
	String msg = lStrings.getString("http.method_post_not_supported");
	if (protocol.endsWith("1.1")) {
	    resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
	} else {
	    resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
	}
    }

ServletConfig类

作用:
-获取Servlet程序的别名,servlet-name的值。
-获取初始化参数init-param
-获取servletContext对象
注:获取web.xml的配置

 <servlet-name>springMvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-serverlet.xml</param-value>
        </init-param>

注:servlet和servletConfig都是由tomcat创建,servlet在第一次使用时创建,Config在Servlet创建时就创建对用的config。

ServletContext

表示servlet上下文,一个模块只有一个servlet对象实例,servletContext是一个域对象。
域对象,可以像map一样存取数据的对象叫域对象。
作用:
-获取web.xml中配置的上下文参数
-获取当前的工作路径
-获取工程部署后在服务器硬盘上的绝对路径
-像map一样存取数据
获取参数

  // get逻辑
  ServletContext servletContext = getServletContext();
   // 参数
   servletContext.getInitParameter();
   // 获取项目路径
   servletContext.getContextPath();
   // 工程部署目录
   servletContext.getRealPath();

存储数据

servletContext.setAttribute();

注:在一个web工程中只有一个对象,web停止对象销毁,启动时创建。

Servlet请求

get:
Accept:客户端能接收的数据类型
Accept–language:可以接受的语言类型
user-agent:浏览器信息
Accept-encoding:客户端可以接受的编码格式或压缩格式
Connection:keep-alvie 响应完毕保持一小会儿连接
closed:关闭释放资源

在这里插入图片描述
post:
referer:表示请求发起是浏览器地址栏中的地址
Content-type:表示发送数据的类型
GET请求:
1.form method等于get
2.a标签
3.link引入样式资源
4.script引入js文件
5.image引入图片
6.浏览器中直接输入地址回车

常见响应码

200:成功
302:请求重定向
404:请求收到数据不存在
500:表示服务器已经收到请求但是服务内部错误

HttpServlet常用方法

getRequestURL:获取请求资源定位符
getRequestURI:获取请求资源路径
getRemoteHost:获取用户IP
getRemotePort:获取端口
getHeader:获取请求头
getParameter:获取请求参数
getParamterValues:获取请求参数
getMiethod:获取请求方式
setAttribute:设置数据
getAttribute:获取域数据
getRequestDispatcher:获取请求转发对象

// 获取参数之前提交,解决乱码
req.setCharacterEncoding(“UTF-8);
req.getParameter("username");
// 多个值
req.getParameterValues();

请求转发

服务器跳转到另外一个资源

// /表示地址为http://ip:port/工程名/,映射到IDEA web目录
RequestDispatcher requestDispatcher =req.getRequestDispatcher("/Serverlet2");
// 请求转发
requestDispatcher.forward(req,resp);

注请求转转发的特点:
-浏览器地址没有变化
-是一次请求
-共享request的数据
-可以 转发值web-info目录下
-不可以访问外部资源

// 可以访问
RequestDispatcher requestDispatcher =req.getRequestDispatcher("/WEB-INFO/jsp/index.jsp");
// 外部资源不可以访问
RequestDispatcher requestDispatcher =req.getRequestDispatcher("www.baidu.com");

ServletBase作用

Servlet转发后由于地址没有变化,因此跳转不回去
Base标签设置工作时参考的相对路径

<html>
<head>
    <title>Title</title>
    // 设置相对路径,参照地址
    <base href="xxx">
</head>
<body>
<p>李勇加油,不负韶华</p>
</body>
</html>

/地址

-浏览器解析:http://ip:port/
-服务器解析:http://ip:port/工程路径
-特殊情况respond.sendRediect("/"); //把/发送到浏览器解析,得到http://ip:port/

HttpservletResponse

请求进来时Tomacat创建
-字节流:getOutputStream()
-字符流 : getWriter();
两个只能使用其中一个,否则会报错

往客户端传递数据

  PrintWriter writer = resp.getWriter();
  writer.write("");

Servlet响应乱码问题

解决方案1:

 resp.setCharacterEncoding("UTF-8");
 resp.setHeader("Content-Type","text/html;charset=utf-8");

解决方案2:

 // 同时设置服务器和客户端都使用UTF-8
 // 此方法一定要在流获取之前才有效
   resp.setContentType("text/html;charset=utf-8");

请求重定向

客户端发送请求至服务端,服务器给客户端一个新的地址访问,客户访问新地址,然后返回数据。
第一种方法:

resp.setStatus(302);
resp.setHeader("Location","http://localhost:8080/web");

第二种方法推荐使用:

resp.sendRedirect("http://localhost:8080/web");

请求重定向的特点:
-地址栏会发生变化
-请求两次
-不共享Request
-不能访问WEB-INFO下的资源
-可以访问外部资源

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值