JavaWeb基础01

1.Servlet基础

概念:运行在服务器端的小程序

  • Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
  • 将来我们自定义一个类,实现Servlet接口,复写方法。

1.基础入门

创建JavaEE项目

正常创建java项目
在这里插入图片描述
然后右击
在这里插入图片描述

点击第二个,添加框架
在这里插入图片描述

就可以看到啦 勾选web点击apply ok 就可以啦
在这里插入图片描述

定义一个类,实现Servlet接口

package servlet;


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

public class ServletDemo01  implements Servlet {


    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

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

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

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
    
}

配置Servlet
在web.xml中添加如下配置文件

<!--    配置servlet-->
    <servlet>
        <servlet-name>demo01</servlet-name>
        <servlet-class>servlet.ServletDemo01</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo01</servlet-name>
        <url-pattern>/demo01</url-pattern>
    </servlet-mapping>

配置分析
在这里插入图片描述
浏览器访问
在这里插入图片描述

2.执行原理

1.当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径

2.查找web.xml文件,是否有对应的标签体内容。

3.如果有,则在找到对应的全类名

4.tomcat会将字节码文件加载进内存,并且创建其对象

5.调用其方法

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

3.Servlet中方法的生命周期

初始化方法init()

public void init(ServletConfig servletConfig)方法,在Servlet被创建时,执行。只会执行一次

提供服务方法service()

public void service(ServletRequest servletRequest, ServletResponse servletResponse)方法,每一次Servlet被访问时,执行。执行多次

获取配置对象方法getServletConfig()

public ServletConfig getServletConfig()方法,获取ServletConfig配置对象

获取Servlet的信息方法getServletInfo()

public String getServletInfo()方法,获取Servlet的一些信息,版本,作者等等。。

销毁方法destroy()

public void destroy()方法,在服务器正常关闭时,执行,执行一次。

Servlet什么时候被创建?

  • 默认情况下,第一次被访问时,Servlet被创建
  • 可以配置执行Servlet的创建时机
<servlet>标签下配置
1. 第一次被访问时,创建
<load-on-startup>的值为负数
2. 在服务器启动时,创建
<load-on-startup>的值为0或正整数

4.Servlet3.0

好处:支持注解配置。可以不需要web.xml了。

实现步骤

  1. 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  2. 定义一个类,实现Servlet接口
  3. 复写方法
  4. 在类上使用@WebServlet注解,进行配置
    @WebServlet(“资源路径”)
    在这里插入图片描述

5.Servlet体系

在这里插入图片描述

  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象

  • HttpServlet:对http协议的一种封装,简化操作

  1. 定义类继承HttpServlet
  2. 复写doGet/doPost方法(对不同的请求,调用不同的方法(请求分流))

代码示例

@WebServlet("/demo02")
public class ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是doGet方法");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是doPost方法");
    }
}

不同的请求,响应不同的方法

6.Servlet访问配置

1.urlpartten:访问Servlet的路径,可以一次性配置多个

  1. 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
  2. 路径定义规则
    1. /xxx:路径匹配
    2. /xxx/xxx:多层路径,目录结构
    3. *.do:访问路径通配符

2.HTTP请求协议

1.基本概念

概念:Hyper Text Transfer Protocol 超文本传输协议
特点

  1. 基于TCP/IP的高级协议
  2. 默认端口号:80
  3. 基于请求/响应模型的:一次请求对应一次响应
  4. 无状态的:每次请求之间相互独立,不能交互数据

2.请求消息数据格式

请求行

请求行格式:请求方式 请求url 请求协议/版本

例如:GET /login.html HTTP/1.1

请求方式

* HTTP协议有7中请求方式,常用的有2* GET:
	1. 请求参数在请求行中,在url后。
	2. 请求的url长度有限制的
	3. 不太安全
    * POST:
    1. 请求参数在请求体中
    2. 请求的url长度没有限制的
    3. 相对安全
请求头

请求头:客户端浏览器告诉服务器一些信息

请求头格式:请求头名称: 请求头值(多个用逗号隔开)

例如:Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

常见的请求头

1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
   可以在服务器端获取该头的信息,解决浏览器的兼容性问题
************************************************************
2. Referer:http://localhost/login.html
* 告诉服务器,我(当前请求)从哪里来?
作用:防盗链,统计工作

请求空行:空行,就是用于分割POST请求的请求头,和请求体的

请求体(正文)

封装POST请求消息的请求参数的

例如:username=zhangsan

请求参数格式

POST /login.html	HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/ *;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://localhost/login.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
			
username=zhangsan	

3.Request对象

什么是Request对象,其实就是服务器已经帮我们封装好了的一个HTTP请求消息数据信息,简化我们开发人员操作

在这里插入图片描述
所以:我们可以通过request对象,操作请求消息

1.request体系

在这里插入图片描述

2.request功能

获取请求行数据

1.获取请求方法:String getMethod()

2.获取虚拟目录:String getContextPath()

3.获取Servlet路径:String getServletPath()

4.获取get方式请求参数:String getQueryString()

5.获取请求URI:String getRequestURI() 或者 StringBuffer getRequestURL()

6.获取协议及版本:String getProtocol()

7.获取客户机的IP地址:String getRemoteAddr()

        //1. 获取请求方法 : String getMethod()
        String method = req.getMethod();
        System.out.println(method); //POST

        //2. 获取虚拟目录 : String getContextPath()
        String contextPath = req.getContextPath();
        System.out.println(contextPath);

        //3. 获取Servlet路径 : String getServletPath()
        String servletPath = req.getServletPath();
        System.out.println(servletPath);

        //4. 获取get方式请求参数 : String getQueryString()
        String queryString = req.getQueryString();

        //5. 获取请求URI : String getRequestURI() or StringBuffer getRequestURL()
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);

        //6. 获取协议及版本
        String protocol = req.getProtocol();
        System.out.println(protocol);

        //7. 获取客户机的IP地址
        String remoteAddr = req.getRemoteAddr();
        System.out.println(remoteAddr);
获取请求头数据

1.String getHeader(String name):通过请求头的名称获取请求头的值
2.Enumeration<String> getHeaderNames():获取所有的请求头名称

Enumeration相当于一个迭代器

代码示例

        //获取所有的请求头
        Enumeration<String> headerNames = req.getHeaderNames();

        while (headerNames.hasMoreElements()){
            String name = headerNames.nextElement();
            //通过请求头的名称获取请求头的值
            String header = req.getHeader(name);
            System.out.println(name+"=="+header);
        }
获取请求体数据

请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数

实现步骤

  1. 获取流对象
  • BufferedReader getReader():获取字符输入流,只能操作字符数据
  • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
  1. 再从流对象中拿数据

代码示例

      //1.获取字符流
        BufferedReader br = req.getReader();
        //2.读取数据
        String line = null;
        while((line = br.readLine()) != null){
            System.out.println(line);
        }
        br.close();
***********************或者************************************
         //1.获取输入流
        ServletInputStream inputStream = req.getInputStream();
        //2.读取数据
        byte[] buff=new byte[1024];
        while ((inputStream.read(buff))!=-1){
            System.out.println(new String(buff));
        }

点击输入
在这里插入图片描述
控制台输出
在这里插入图片描述

注意:如果输入的是中文,name=%E5%BC%A0%E4%B8%89,需要转一下码

获取请求参数通用方式

获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数

1. String getParameter(String name):根据参数名称获取参数值
2. String[] getParameterValues(String name):根据参数名称获取参数值的数组(用于复选框)
3. Enumeration<String> getParameterNames():获取所有请求的参数名称
4. Map<String,String[]> getParameterMap():获取所有参数的map集合

中文乱码问题

  • get方式:tomcat 8 已经将get方式乱码问题解决了
  • post方式:会乱码
    解决办法:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
        //设置编码
        req.setCharacterEncoding("utf-8");
        //1.根据参数名称获取参数值 String getParameter(String name)
        String name = req.getParameter("name");
        System.out.println(name);
        System.out.println("************************************");
        //2.根据参数名称获取参数值的数组 String[] getParameterValues(String name)`
        String[] hobbies = req.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
        System.out.println("************************************");
        //3.获取所有请求的参数名称 Enumeration<String> getParameterNames()
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String s = headerNames.nextElement();
            String parameter = req.getParameter(s);
            System.out.println(s+"=="+parameter);
        }
        System.out.println("************************************");
        //4.获取所有参数的map集合 Map<String,String[]> getParameterMap()
        Map<String, String[]> parameterMap = req.getParameterMap();
        Set<String> strings = parameterMap.keySet();
        for (String key : strings) {
            String[] value = parameterMap.get(key);
            System.out.println(key+"=="+value);
        }
        System.out.println("************************************");

请求转发(Request)

请求转发原理图
在这里插入图片描述
实现步骤
1.告诉浏览器我们要转发的目的地:RequestDispatcher getRequestDispatcher(String path)
2.进行转发:forward(ServletRequest request, ServletResponse response)

代码示例

request04

@WebServlet("/request04")
public class request04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是request04。。。");
        //转发到request05资源

        //1.我们要转发的目的地
        RequestDispatcher requestDispatcher = req.getRequestDispatcher("//request05");
        //2.进行转发
        requestDispatcher.forward(req,resp);
    }
}

request05

@WebServlet("/request05")
public class request05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("这是request05。。。");
    }
}

显示结果
在这里插入图片描述

请求转发特点:

  1. 浏览器地址栏路径不发生变化
  2. 只能转发到当前服务器内部资源中。
  3. 转发是一次请求
共享数据

域对象:一个有作用范围的对象,可以在范围内共享数据
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
在这里插入图片描述
方法

1. void setAttribute(String name,Object obj):存储数据
2. Object getAttitude(String name):通过键获取值
3. void removeAttribute(String name):通过键移除键值对

代码示例
request04

@WebServlet("/request04")
public class request04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //储存数据到request域中去
        req.setAttribute("name","xiaoming");
        
        System.out.println("这是request04。。。");
        
        //转发给request05资源中去(告诉request5起来干活了)
        req.getRequestDispatcher("/request05").forward(req,resp);
    }
}

request05

@WebServlet("/request05")
public class request05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("这是request05。。。");
        // 从request域中获取对象
        String  name = (String)req.getAttribute("name");

        System.out.println(name);
    }
}

显示结果
在这里插入图片描述
原理分析
在这里插入图片描述

获取ServletContext

方法
ServletContext getServletContext(): 获取ServletContext

代码示例

        ServletContext context = req.getServletContext();
        System.out.println(context);

显示结果
在这里插入图片描述

3.登录案例

登录页面 login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
    <!--    设置css样式-->
    <style type="text/css">
        #top{
            height: 60px;
            border:2px solid red;
        }
        #body{
            height: 600px;
            border:2px solid red;

        }
        #bottom{
            height: 60px;
            border:2px solid red;
        }

        #login{
            height: 500px;
            width: 400px;
            border:2px solid red;
            float: left;
            margin-top: 50px;
            margin-left: 60%;
            padding-left: 20px;


        }
        .td{
            /*border: red 2px solid;*/
            padding-left: 20px;
            text-align: right;
        }
        .td1{
            /*border: red 2px solid;*/
            padding-left: 20px;
            text-align: left;
        }

        #username,#password,#checkcode{
            width: 200px;
            height: 32px;
            border: 1px solid #A6A6A6 ;
            /*设置边框圆角*/
            border-radius: 5px;
            padding-left: 10px;

        }


        .trhead{
            height: 75px;
        }

        .sub{
            width: 75px;
            height: 50px;
            border: red 2px solid;
            border-radius: 5px;
            background-color: #FFD026;
        }

    </style>
</head>
<body>
<div id="top">

</div>
<div id="body">

    <div id="login">
        <form action="/javaWeb02/request06" method="post">
            <table >
                <!--   用户名称-->
                <tr class="trhead">
                    <td class="td">用户名</td>
                    <td class="td1"><input type="text" id="username" name="username" placeholder="请输入用户名"></td>
                </tr>

                <tr class="trhead">
                    <td class="td">密码</td>
                    <td class="td1" align=""><input  type="text"   id="password" name="password" placeholder="请输入用户名"></td>
                </tr>

                <tr class="trhead">
                    <td class="td"  colspan="2" style="text-align: center"><input class="sub" type="submit" id="login1" value="登录"></td>
                </tr>

                <tr class="trhead">
                    <td class="td" colspan="2" style="text-align: center"><a href="#">没有账户?点击注册</a></td>
                </tr>

            </table>
        </form>
    </div>

</div>
<div id="bottom">


</div>
</body>
</html>

登录逻辑代码

@WebServlet("/request06")
public class request06 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.setCharacterEncoding("utf-8");
       //模拟数据库中的数据
       String name="小明";
       String password="123321";

       //获取数据
        String uname = req.getParameter("username");
        String pd = req.getParameter("password");

        //判断用户输入是否正确
        if (name.equals(uname)&&password.equals(pd)){
            System.out.println("登录成功");
        }
        else {
            System.out.println("登录失败");
        }
    }
}

代码示例
在这里插入图片描述

4.HTTP响应协议

1.基本概念

概念:Hyper Text Transfer Protocol 超文本传输协议
特点

  1. 基于TCP/IP的高级协议
  2. 默认端口号:80
  3. 基于请求/响应模型的:一次请求对应一次响应
  4. 无状态的:每次请求之间相互独立,不能交互数据

2.响应消息数据格式

响应行

响应行格式:协议/版本 响应状态码 状态码描述

例如:HTTP/1.1 200 OK

响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

	1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
	2. 2xx:成功。代表:200
	3. 3xx:重定向。代表:302(重定向)304(访问缓存)
	4. 4xx:客户端错误。
			* 代表:
				* 404:(请求路径没有对应的资源) 
				* 405:请求方式没有对应的doXxx方法
	5. 5xx:服务器端错误。代表:500(服务器内部出现异常)
响应头

响应头:服务器告诉客户端浏览器一些信息

响应头格式:头名称: 值

例如:
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT

常见的请求头

1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
************************************************************
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
** in-line:默认值,在当前页面内打开
* attachment;filename=xxx:以附件形式打开响应体。文件下载

响应空行:空行,就是用于分割POST响应的响应头,和响应体的

响应体(正文)

响应体(正文):响应体就是我们的HTML页面

	<html>
	  <head>
	    <title>$Title$</title>
		  </head>
		  <body>
		  hello , response
		  </body>
	</html>

响应参数格式

HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
	
<html>
 <head>
 <title>$Title$</title>
	  </head>
	  <body>
	  hello , response
	  </body>
</html>

5.Response对象

在这里插入图片描述
功能:设置响应消息

设置状态码

void setStatus(int sc):设置状态码

代码示例

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo1........");
        //1. 设置状态码为500
        resp.setStatus(500);
    }

浏览器显示结果
在这里插入图片描述

设置响应头

void setHeader(String name, String value) :通过头名称,去设置响应头

代码示例

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("demo1........");

        //2.设置响应头(设置location的响应头)
        resp.setHeader("location","hello,respones");
    }

在这里插入图片描述

设置响应体

方法

  • 获取字符输出流:PrintWriter getWriter()

  • 获取字节输出流:ServletOutputStream getOutputStream()

代码示例

字符输出流

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response01");
        
        //字符输出流:PrintWriter getWriter()
        //1.获取输出对象
        PrintWriter writer = resp.getWriter();
        //2.往浏览器页面输出数据
        writer.println("this is response01");
        writer.close();
        
    }

字节输出流

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response01");

        //字节输出流:ServletOutputStream getOutputStream()
        //1.获取输出对象
        ServletOutputStream outputStream = resp.getOutputStream();
        //2.往浏览器页面输出数据
        outputStream.println("this is response01");
        outputStream.close();

    }

网页显示
在这里插入图片描述

重定向(Response)

与请求转发一样,重定向也是进行资源跳转,只不过是用Response对象进行资源跳转,但是重定向有重定向的特点

实现步骤

  • 设置状态码
  • 设置响应头

代码示例

response01

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response01");
        //重定向
        //1.设置状态码
        resp.setStatus(302);
        //2.设置响应头
        resp.setHeader("location","/javaWeb02/response02");
    }

response02

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet");
    }

控制台输出
在这里插入图片描述
网页显示
在这里插入图片描述

重定向简单方法
resp.sendRedirect("/javaWeb02/response02");

重定向与请求转发

重定向的特点:redirect

  1. 地址栏发生变化
  2. 重定向可以访问其他站点(服务器)的资源
  3. 重定向是两次请求。不能使用request对象来共享数据

转发的特点:forward

  1. 转发地址栏路径不变
  2. 转发只能访问当前服务器下的资源
  3. 转发是一次请求,可以使用request对象来共享数据

6. ServletContext对象

概念:代表整个web应用,可以和程序的容器(服务器)来通信

获取ServletContext对象

  1. 通过request对象获取:request.getServletContext();
  2. 通过HttpServlet获取:this.getServletContext();
代码示例
        //获取ServletContext方法(方式一)
        ServletContext servletContext01 = req.getServletContext();
        //获取ServletContext方法(方式二)
        ServletContext servletContext02 = this.getServletContext();

获取的是同一个对象

1.获取MIME类型

String getMimeType(String file) :获取MIME类型

MIME类型:在互联网通信过程中定义的一种文件数据类型

  • 格式: 大类型/小类型 text/html image/jpeg

代码示例

    获取MIME类型
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext方法(方式一)
        ServletContext servletContext01 = req.getServletContext();
        //获取MIME类型
        String mimeType = servletContext01.getMimeType("a.jpg");
        System.out.println(mimeType); //image/jpeg

    }
    

2.ServletContext域对象(连接域对象)

  1. setAttribute(String name,Object value):上传数据
  2. getAttribute(String name) :下载数据
  3. removeAttribute(String name):删除数据

范围是什么呢?
ServletContext对象范围:所有用户所有请求的数据(张三往里面存了数据,李四从里面拿数据)

两个独立的Servlet

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext方法(方式一)
        ServletContext servletContext01 = req.getServletContext();
        //设置数据
        servletContext01.setAttribute("name","哈哈哈");


    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取ServletContext方法(方式一)
        ServletContext servletContext01 = req.getServletContext();
        //获取数据。
        String name =(String)servletContext01.getAttribute("name");
        System.out.println(name);
    }

通过浏览器分别访问,查看控制台
在这里插入图片描述

3.获取文件的真实(服务器)路径

String getRealPath(String path) :获取文件的真实(服务器)路径

在这里插入图片描述

文件对应的工作空间路径

代码示例

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = this.getServletContext();
        
        String realPath1 = servletContext.getRealPath("/b.txt");
        System.out.println(realPath1);

        String realPath2 = servletContext.getRealPath("/WEB-INF/c.txt");
        System.out.println(realPath2);

        String realPath3 = servletContext.getRealPath("/WEB-INF/classes/a.txt");
        System.out.println(realPath3);
    }

显示结果
在这里插入图片描述

4.文件下载案例

7.其他

1.访问路径

相对路径

相对路径:通过相对路径不可以确定唯一资源

如:./index.html ,不以/开头,以.开头路径

规则:找到当前资源和目标资源之间的相对位置关系

  • ./:当前目录
  • …/:后退一级目录

绝对路径

绝对路径:通过绝对路径可以确定唯一资源

如:http://localhost/study/responseDemo2 简写为/day15/responseDemo2
 */开头的路径

规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出

  • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
  1. 建议虚拟目录动态获取:request.getContextPath()
  2. < a> , < form> 重定向…
  • 给服务器使用:不需要加虚拟目录

2.字符集编码

向浏览器输出中文,代码如下

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response03");
        PrintWriter writer = resp.getWriter();
        writer.println("哈哈哈!");
        writer.close();
    }

浏览器显示结果
在这里插入图片描述

可以看到,浏览器显示乱码,出现的原因是因为浏览器不知道服务器发送的消息体数据的编码,浏览器还是默认自己的编码格式

解决办法
告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码

代码示例

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response03");
        //告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码
        resp.setHeader("content-type","text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("哈哈哈!");
        writer.close();
    }

显示结果
在这里插入图片描述

我们可以看到显示结果还是乱码
其原因是因为:由于resp获取出来的字符流编码是Tocat 默认的ISO-8859-1编码,所以我们要设置一下resp获取出来的字符流编码

完整的解决办法

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("response03");
        //由于resp获取出来的字符流编码是Tocat 默认的ISO-8859-1编码,
        //所以我们要设置一下resp获取出来的字符流编码

        //设置resp获取出来的字符流编码
        resp.setCharacterEncoding("utf-8");

        //告诉浏览器,服务器发送的消息体数据的编码。建议浏览器使用该编码解码
        resp.setHeader("content-type","text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("哈哈哈!");
        writer.close();
    }

简单的形式,设置编码
resp.setContentType(“text/html;charset=utf-8”);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值