javaWeb-Servlet


一、Servelet是什么?

Servlet是开发动态web的一门技术

是API中的一个接口,是实现了Servlet的Java程序

二、使用步骤

1.编写一个Servlet程序

1、在java资源包下新建servlet包
2、在该包下新建类并让该类继承HttpServlet
3、重写doGet()、doPost()方法
4、给新建的类实现servlet映射
或者对着包名右键new Servlet即可自动创建(注意要取消掉Create Java EE 6 annotated class的勾选)

2.编写Servlet映射

因为我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以需要在web服务中注册我们写的Servlet,还需给他一一个浏览器能够访问的路径(在web.xml中添加)

<servlet>
     <servlet-name>helloServlet</servlet-name>
     <servlet-class>com.veterlemon.servlet.HelloServlet</servlet-class>
 </servlet>
 <!--一个servlet对应一个mapping:映射-->
 <servlet-mapping>
     <servlet-name>helloServlet</servlet-name>
     <!--映射的请求路径: http://ip:port/工程路径/hello-->
     <url-pattern>/hello</url-pattern>
 </servlet-mapping>

3.配置tomcat

见Maven设置篇
https://blog.csdn.net/weixin_42431775/article/details/122872077

4.防止中文乱码

设置客户端和服务器的编码格式

//doGet()或doPost()方法中加入
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");

5.启动测试

三、Servlet的继承关系

在这里插入图片描述

四、Servlet访问原理

浏览器发送请求至web容器并访问Servlet,调用service方法通过request拿到请求、response响应请求,最后返回至web容器从而响应客户端
一个Servlet可以指定多个通用映射路径(servlet-mapping)
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求

五、原始继承了Servlet类的写法

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

public class HelloServlet implements Servlet {
	//构造器
    public HelloServlet() { System.out.println("1"); }
    
    @Override
    public void init(ServletConfig servletConfig) throws ServletException { System.out.println("2"); }
    
    @Override
    public ServletConfig getServletConfig() { return null; }
    //处理请求和响应
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        //分发请求
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        String method = httpServletRequest.getMethod();
        if ("GET".equals(method))
            doGet();
        else if("POST".equals(method))
            doPost();
    }
    
    //分发请求处理:GET
    public void doPost(){ System.out.println("get请求"); }
    //分发请求处理:POST
    public void doGet(){ System.out.println("post请求"); }
    
    @Override
    public String getServletInfo() { return null; }
    
    @Override
    public void destroy() { System.out.println("4"); }
}

1.ServletConfig类

是servlet程序的配置信息类(Servlet程序和ServletConfig由Tomcat创建),作用:
1、可以获取Servlet程序的别名servlet-name的值

//init方法内
System.out.println("HelloServlet程序的别名是:" + servletConfig.getServletName());

2、获取初始化参数init-param(得现在web.xml的servlet标签中配置init-param)

//web.xml中
<!--init-param是初始化参数-->
<init-param>
	<!--是参数名-->
	<param-name>username</param-name>
	<!--是参数值-->
	<param-value>root</param-value>
</init-param>

//init方法内
System.out.println("初始化参数username的值是:" + servletConfig.getInitParameter("username"));
System.out.println("初始化参数value的值是:" + servletConfig.getInitParameter("value"));

3、获取ServletContext对象

//init方法内
//获取ServletContext对象
System.out.println(servletConfig.getServletContext());

2.ServletContext类

ServletContext是一个接口,代表servlet上下文对象(域对象,一个web项目共用一个对象),作用:
域对象:是可以像Map一样存取数据的对象(域指的是存取数据的操作范围)
存数据,取数据,删除数据
setAttribute(),getAttribute(),removeAttribute()

1、获取web.xml中配置的上下文参数context-param

//web.xml文件中配置context-param
<!--上下文参数,可多组-->
<context-param>
	<param-name>username</param-name>
   	<param-value>context</param-value>
</context-param>
<context-param>
	<param-name>password</param-name>
   	<param-value>root</param-value>
</context-param>

//方法中
ServletContext servletContext = getServletConfig().getServletContext();
String username = servletContext.getInitParameter("username");
System.out.println("context-param参数的name属性值是:" + username);
System.out.println("context-param参数的value属性值是:" + context.getInitParameter("password"));

2、获取当前的工程路径,格式:/工程路径

ServletContext servletContext = getServletConfig().getServletContext();
System.out.println("当前工程路径为:" + servletContext.getContextPath());

3、获取工程部署后在服务器硬盘上的绝对路径

ServletContext servletContext = getServletConfig().getServletContext();
//工程下web目录所在的绝对路径
System.out.println("工程部署的绝对径为:" + servletContext.getRealPath("/"));
//工程下web目录下的css目录所在的绝对路径
System.out.println("工程部署的绝对径为:" + servletContext.getRealPath("/css"));

4、像Map一样存取数据

ServletContext servletContext = getServletConfig().getServletContext();
servletContext.setAttribute("key", "value");
System.out.println("context中获取域数据key的值是:" + servletContext.getAttribute("key"));

六、HttpServletRequest类

通过HttpServletRequest对象,可以获取所有请求信息

1.常用方法:

//获取请求的统一资源定位符(绝对路径)
System.out.println("URI=" + request.getRequestURI());
//获取客户端的ip地址
System.out.println("URL=" + request.getRequestURL());
//获取请求头
System.out.println("客户ip=" + request.getRemoteHost());
//获取请求的参数
System.out.println("请求头的User-Agent" + request.getHeader("User-Agent"));
//获取请求的方式GET或POST
System.out.println("请求的方式" + request.getMethod());
//获取请求的参数(多个值的时候使用)
String username = request.getParameter("username");
String password = request.getParameter("password");
String[] hobby = request.getParameterValues("hobby");
System.out.println("获取请求的参数-用户名:" + username +
        ",获取请求的参数-密码:" + password + ",获取 请求的参数-爱好:" + Arrays.asList(hobby));

2.请求转发的实现

本质上是一次HTTP请求(相当于请求的递归)
浏览器的地址不变,Servlet_01和Servlet_02共享Request域的数据
在这里插入图片描述

//Servlet_01类

//获取请求参数
String username = request.getParameter("username");
System.out.println("在servlet1中查看参数:" + username);
//设置域值
request.setAttribute("key", "柜台1的章");
//转发,转发的地址为servlet-mapping的url-pattern
RequestDispatcher requestDispatcher = request.getRequestDispatcher("/servlet_02");
requestDispatcher.forward(request, response);

//Servlet_02类
//获取请求参数
String username = request.getParameter("username");
System.out.println("在servlet2中查看参数:" + username);
//查看servlet1是否有”盖章“
Object key = request.getAttribute("key");
System.out.println("servlet1是否有“盖章”:" + key);
//处理自己的业务
System.out.println("servlet2的业务");

七、HttpServletResponse类

通过HttpServletResponse对象,可以设置响应信息

1.通过HttpServletResponse对象设置响应

2.通过输出流将响应回传

字节流:getOutputStream(),常用于下载(传递二进制数据)
字符流:getWriter(),常用于回传字符串(最常用)
二者只能用其一

//防止乱码
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
//往客户端回传数据
PrintWriter writer = response.getWriter();
writer.write("这是回传的数据");

3.请求重定向

服务器端在响应客户端第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。本质上是两次HTTP请求(相当于请求的迭代),对应两个request对象
在这里插入图片描述

//response_01的代码
//请求重定向形式一
System.out.println("resopnse01");
//设置响应状态:302请求重定向
response.setStatus(302);
//设置响应头,说明新地址
response.setHeader("Location", "http://localhost:8080/javaWeb_myDemo/response_02");
//请求重定向形式二(推荐)
response.sendRedirect("http://localhost:8080/javaWeb_myDemo/response_02");

//response_02的代码
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("response2的结果");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值