servlet学习笔记

1.hello servlet

1.1重写doGet()和doPost()方法

package com.servlet;

import javax.servlet.ServletContext;
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 MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        PrintWriter writer = resp.getWriter();
        writer.println("<h1>你好 servlet</h1>");
        
        
        //这部分是设置context键值对,第2部分内容,写入servletcontext信息
        ServletContext context = this.getServletContext();
        context.setAttribute("name","用户名");
    }

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

}

1.2 servlet注册映射

在web.xml文件中写入

<servlet>
  <servlet-name>hello</servlet-name>
  <servlet-class>com.servlet.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>hello</servlet-name>
  <url-pattern>/hello</url-pattern>
</servlet-mapping>

1.3 运行结果

请添加图片描述

2.ServletContext

servletContext是所有servlet共享的一个对象,可以用于多个servlet进行信息传递

就和多线程中共享存储器类似

2.1一个servlet向共享的servletcontext写入数据

完整代码请看1.1

 		ServletContext context = this.getServletContext();
        context.setAttribute("name","用户名");

2.2另一个servelt读取context中的信息

public class Getcontext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        ServletContext context = this.getServletContext();
        String name = (String) context.getAttribute("name");

        PrintWriter writer = resp.getWriter();
        writer.println("<h1>get name = </h1>"+name);
    }

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

2.3servlet注册映射

<servlet>
  <servlet-name>gc</servlet-name>
  <servlet-class>com.servlet.Getcontext</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>gc</servlet-name>
  <url-pattern>/get</url-pattern>
</servlet-mapping>

后面有需要注册映射的省略不写

2.4运行结果

请添加图片描述

3.get parameter

在xml文件中存在parameter预设属性,可以通过servletcontext的getInitParameter(name:)方法获取到属性值

<context-param>
  <param-name>mysqlurl</param-name>
  <param-value>数据库jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
public class Getparam extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");

        ServletContext context = this.getServletContext();
        String name = (String) context.getInitParameter("mysqlurl");

        PrintWriter writer = resp.getWriter();
        writer.println("<h1>get parameter = </h1>"+name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        this.getInitParameter();
//        this.getServletConfig()
    }
}

运行结果

请添加图片描述

4.转发 getRequestDispatcher()

servletcontext对象 的getRequestDispatcher(path)函数可以转发网页

与重定向不同,转发会直接得到转发的网页,而不是让用户重新访问新网页

转发到上一个get parameter页面的gp路径

public class GetDispatcher extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        ServletContext context = this.getServletContext();
        System.out.println("进入了getdispatcher");
        context.getRequestDispatcher("/gp").forward(req ,resp);

//        String charset ="GBK"; //假定编码格式
//        String str = "中文";
//
//        boolean flag = str.equals(new String(str.getBytes(),charset));
//        System.out.println(flag);
//        System.out.println("当前JRE:" + System.getProperty("java.version"));
//        System.out.println("当前JVM的默认字符集:" + Charset.defaultCharset());


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        this.getInitParameter();
//        this.getServletConfig()
    }
}

4.1中文乱码问题

中途遇到了控制台中文乱码的现象,System.out.println(“进入了getdispatcher”);中文无法显示

解决方案在上一篇文章,tomcat中文乱码文末

就是设置环境变量 JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8

4.2运行结果

请添加图片描述

5.资源读取getResourceAsStream()

中resource目录下资源在编译后会保存到target里的web项目的classes文件夹下

public class GetStreamProperties extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");

        InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");

        Properties prop = new Properties();
        prop.load(inputStreamReader);
        String name = prop.getProperty("username");
        String pwd = prop.getProperty("password");

        resp.getWriter().println(name+":"+pwd);
        System.out.println(name+":"+pwd);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        this.getInitParameter();
//        this.getServletConfig()
    }
}

4.1中文乱码问题

刚开始使用老师的方法

InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");

prop.load(inputStream);

会导致db.properties中的中文读取出来乱码

所以改成了

InputStream inputStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");
prop.load(inputStreamReader);

4.2运行结果

请添加图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TwilightPureDrm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值