J2EE学习笔记-Servlet篇

1⃣️笔记篇

这片笔记是看动力节点的J2EE做的笔记(所以我的观点不一定是对的😂😂😂)

1.网站中所有的servlet接口实现类的实例对象,只能由http服务器负责创建。
开发人员不能手动创建servlet接口实现类的实例对象

  1. 在默认的情况下,此http服务器接收到对于当前servlet接口实现类第一次请求时
    自动创建这个servlet接口实现类的实例对象
    在手动配置情况下,要求http服务器在启动时自动创建某个servlet接口实现类的实例对象
        <servlet>
            <servlet-name >mmn</servlet-name><!--声明一个变量存储servlet接口实现类类跳中。-->
            <servlet-class>com.bjpowernode.controller.OneSerlvet</servlet-class>
            <load-on-startup>30<load-on-startup> 
            <!--这里的load-on-startup的意思是启动Tomcat的时候自动创建这个Servlet对象-->
            <!-- 正常情况下是要访问了这个网页才创建这个Servlet对象 --> 
            <!-- 填写一个大于0的整数即可 -->
        </servlet>
<servlet>
	<servlet-name>TwoServelet</servlet-name>
	<servlet-class>com.bjpowernode.controller.TwoServlet</servlet-class>
	<servlet-mapping>
		<servlet-name>TwoServelet</servlet-name>
		<url-parttern>/two</url-parttern><!--url访问的时候可以/two访问-->
	</servlet-mapping>
</servlet>

3.在http服务器运行期间,1个servlet接口实现类只能被创建出一个实例对象

  1. 在http服务器关闭时刻,自动将网站中所有的servlet对象进行销毁

下面这张图的申请的资源就是TwoServlet
调用语句
request.getRequestDispatcher(“xxx.jsp”).forward(request, response);
好处:减少了和浏览器的交互次数,第二次调用是在服务端调用的,节省了时间开销

1) 无论本次请求选及到多少个servlet,用户只需要手动通过浏览器发送一次请求
2) servlet之间调用发生在服务端计算机上,节省服务端与浏览器之间往返次数
增加处理服务速度
在这里插入图片描述

2⃣️Servlet运行示例代码

MyLogin.java
如果webServlet的写了name属性,那么他的双引号里面开头就不需要以/开头了,如果没有name属性,则需要以/开头

package test;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@WebServlet (name="myUserServlet",urlPatterns = "/Login")
public class MyLogin extends HttpServlet {
    public void doPost(HttpServletRequest req, HttpServletResponse res){
        String un=req.getParameter("username");//username是从req里面获取的一个参数,从表单里面获取一个名字是username的组件,然后获取其值并输出
        try
        {
            System.out.println("servlet is running!!");
            res.setContentType("text/html;charset=gb2312");
            PrintWriter pw=res.getWriter();
            pw.print("<H1>Thank you"+un+".</H1>");
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <h1>Login</h1>
    <form action="Login"method="post"><!--这里的action指向的文件要和上文提到的urlPartern指示的路径要一致,否则程序不能正常运行-->
        <p>Username:
        <input type="text" name="username" size="20">
        <p>password:
        <input type="password" name="password" size="21">
        <input type="submit" value="提交">
    </form>
  </body>
</html>

在这里插入图片描述

3⃣️HttpServlet

Servlet是一个接口,其子类实现Servlet的时候需要实现其中的所有抽象方法,包括service方法,service再根据不同的请求方式来做不同的响应,子类因此需要根据不同的请求方式来编写重复的代码,非常的不方便,因此在这种情况下,子类可以继承HttpServlet,HttpServlet是Servlet的子类,HttpServlet有doPost和doGet等方法,可以根据不同的请求方式来调用不同的方法,避免了代码的重复编写

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/demo2")//资源请求路径
public class ServerletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpServletRequest request=req;
        //编写不同的业务代码
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	        //编写不同的业务代码		
    }


}

4⃣️Request的中文乱码

中文乱码有get请求和post请求下的中文乱码
解决方案:

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
	       request.setCharacterEncoding("UTF-8");//doPost第一句代码这样写就行,一定要在第一句!!
    }

5⃣️重定向与请求转发区别

在这里插入图片描述

6⃣️虚拟目录的问题

在这里插入图片描述

7⃣️在Servlet里面往网页里面写html的内容

下面是登陆页面:跳转到一个servlet

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title></title>
  </head>
  <body>
  <center>
    <H1>登陆系统</H1>
  <form action="ServletDemo3" method="get">
    账号:<input type="text" name="1" value="zhangsan"><br>
    密码:<input type="password" name="2" value="123"><br>
      <input type="submit">&nbsp;&nbsp;&nbsp;
      <input type="reset">
  </form>
  </center>
  </body>
</html>

下面的代码注释了response.setHeader("content-type", "text/html");
代码中的response.setHeader("content-type", "text/html");设置相应头的内容(content-type),设置为以html格式来解析网页的文本内容(text/html)

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/ServletDemo3")
public class ServletDemo3 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
       // response.setHeader("content-type", "text/html");
        PrintWriter pw=response.getWriter();
        pw.println("<h1>LoginSystem</h1>");
        //该字符流不需要关闭,随着reponse对象的销毁,该流自动关闭!!
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

效果:
在这里插入图片描述

代码解除注释response.setHeader("content-type", "text/html");
在这里插入图片描述

另外,如果response写到网页的内容乱码了,可以在doPost或者doGet里面第一句写
response.setContentType("text/html;charset=utf-8");,就不用设置相应头来以html格式解析网页文本内容,而且直接就以utf-8来解析内容,但是这个语句的内容先后次序不能乱!!!

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter pw=response.getWriter();
        pw.println("<h1>LoginSystem</h1>");
        
    }

说多一句:Tomcat默认字符集就是ISO-8859-1,浏览器默认字符集是utf-8,所以很多情况下中文都是乱码!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿维的博客日记

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

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

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

打赏作者

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

抵扣说明:

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

余额充值