Servlet(一)----实现方式

1.Servlet:Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。
狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
在这里插入图片描述
2.工作模式:
客户端发送请求至服务器
服务器启动并调用 Servlet,Servlet 根据客户端请求生成响应内容并将其传给服务器
服务器将响应返回客户端
3.实现Servlet接口并实现其中的方法

Servlet中的service方法用于应答浏览器请求,每次请求都会调用该方法。
ServletRequest:封装了请求信息,可以从中获取到任何的请求信息。
ServletResponse:封装了响应信息,用于响应用户请求。
这两个接口都是服务器给予实现的,并在服务器调用service方法时传入。

第一种实现方法:

package servlet;

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

//Servlet:Server Applet
/*
其实Servlet就是JSP翻译之后的那个类
但是
Servlet是一个类,而页面之间的跳转通过路径(URL)来走的!
它就需要具备类的基本特质,而且还需绑定一个URL来调用这个类
 */
//第一种Servlet的实现方式
public class FirstServlet implements Servlet {
    //第一次请求时执行
    public FirstServlet(){
        System.out.println("First构造器");
    }
    @Override
    //初始化方法  第一次请求时执行
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("firstInit");
    }
    //获取Config对象方法
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    //关键方法,服务方法  每一次请求时执行
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("firstService");
    }
    //获取到Servlet信息方法
    @Override
    public String getServletInfo() {
        return "first";
    }
    //销毁方法  关闭时执行一次
    @Override
    public void destroy() {
        System.out.println("firstDestroy");
    }
}

- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XM7D2Tpq-1569602477430)(C:\Users\xuan\AppData\Roaming\Typora\typora-user-images\1569581089205.png)]
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nMfIaxfg-1569602477431)(C:\Users\xuan\AppData\Roaming\Typora\typora-user-images\1569581500965.png)]

第二种实现方法:

package servlet;

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;

//第二种Servlet实现方法
public class SecondServlet extends GenericServlet {
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("第二种Servlet的实现方法");
    }
    //方法可以自己加(即第一种中有的方法)
    public void destroy() {
        System.out.println("Second Destroy");
    }
}

第三种实现方式:

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

//第三种,最常用的Servlet实现方式
public class ThirdServlet extends HttpServlet {
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Three的post");//form表单method属性为post时执行
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Three的get");//浏览器中执行,form表单method属性为get时执行等
    }
}

在使用表单提交数据到服务器的时候有两张方式可共选择,一个是post一个是get。可在<form>中的method属性中指定提交的方式。如:<form action="inputForm"method="get">,如果不指定method属性,则会默认该属性为”get”方式。

Get和post都能够提交数据,那么他们有什么不同呢?

通过get方式提交的数据有大小的限制,通常在1024字节左右。也就是说如果提交的数据很大,用get方法就可需要小心;而post方式没有数据大小的限制,理论上传送多少数据都可以。

通过get传递数据,实际上是将传递的数据按照”key,value”的方式跟在URL的后面来达到传送的目的的;而post传递数据是通过http请求的附件进行的,在URL中并没有明文显示。

get是从服务器上获取数据,post是向服务器传送数据。
get调用用于获取服务器信息,并将其做为响应返回给客户端。当经由Web浏览器或通过HTML、JSP直接访问Servlet的URL时,一般用GET调用。
Post它用于客户端把数据传送到服务器端,也会有副作用。
get方式传递的数据量小,安全性不高,执行效率高,适合用于搜索等机密性不高的数据,post方式传递的数据量大,安全性高,执行效率低,适合用于账号密码,修改删除添加信息的传递。

编码转换在request请求里面,get方法得到的内容每一个都要进行编码转换,需要配置tomcat编码设置,而post方法则只要设置request.setCharacterEncoding("UTF-8")就可以。

 Servlet的doGet/doPost 是在 javax.servlet.http.HttpServlet 中实现的

          doGet:处理GET请求 
          doPost:处理POST请求 
      当发出客户端请求的时候,调用service 方法并传递一个请求和响应对象。Servlet首先判断该请求是GET 操作还是POST 操作。然后它调用下面的一个方法:doGet 或 doPost。如果请求是GET就调用doGet方法,如果请求是POST就调用doPost方法。doGet和doPost都接受请求(HttpServletRequest)和响应(HttpServletResponse)。
     
     当form框里面的method为get时,执行doGet方法,使用get提交就必须在服务器端用doGet()方法接收;当form框里面的method为post时,执行doPost方法,使用post提交就必须在服务器端用doPost()方法接收。

2.打开web.xml文件(在WEB-INF中),配置Servlet

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!--配置Servlet:给每个Servlet起一个URL-->
  <servlet>
    <servlet-name>first</servlet-name><!--起名字-->
    <servlet-class>servlet.FirstServlet</servlet-class><!--Servlet的全类名-->
  </servlet>
  <servlet>
    <servlet-name>second</servlet-name>
    <servlet-class>servlet.SecondServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>Third</servlet-name>
    <servlet-class>servlet.ThirdServlet</servlet-class>
  </servlet>

  <servlet-mapping><!--标记,映射   作用是让url-pattern和上面的路径绑定-->
    <servlet-name>first</servlet-name>
    <url-pattern>/first</url-pattern><!--通过这个网址来找到上面的servlet.FirstServlet类-->
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>second</servlet-name>
    <url-pattern>/second</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>Third</servlet-name>
    <url-pattern>/Third</url-pattern>
  </servlet-mapping>
</web-app>

注意:servlet必须整体在servlet-mapping前面

4.配置tomcat,启动
5.Servlet的生命周期:装载、初始化(创建、初始化)、服务和销毁
1.装载:在服务器启动时装载web.xml中配置的所有Servlet,所以tomcat也叫Servlet容器
2.初始化:第一次请求当前ServletURL时执行,并只执行一次
3.服务:每一次请求时都会执行的内容,调用此方法时会传递request和response对象
4.销毁:服务器关闭时,执行的操作,一般销毁就是进行一些关闭操作

6.Servlet可以输出一个页面

package servlet;

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("/A")//注解,使用它就不用注册web.xml
//Servlet能够显示一个页面
public class DemoAServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");//设置浏览器页面的编码
        PrintWriter out = resp.getWriter();//得到输出对象
        out.println("<html>");
        out.println("<head>");
        out.print("<title>我的第一个Servlet显示页面</title>");
        out.println("</head>");
        out.println("<body>");
        out.print("<span style='color:red'>你好,中国!</span>");
        out.println("</body>");
        out.println("</html>");
    }
}```


7.获取内容作出响应
DemoBServlet.java
```java
package servlet;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
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("/B")
public class DemoBServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");//设置请求接收过来的编码集
        //获取请求
        String name = req.getParameter("name");//获取到参数值为name的对象
        System.out.println("发送过来的内容为:"+name);
        //响应
        resp.sendRedirect("index.jsp");
    }
}

a.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form method="post" action="B">
    <input type="text" name="name"/>
    <button>发送</button>
</form>
</body>
</html>

DemoCServlet.java

package servlet;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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;

public class DemoCServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Config对象
        /*
        getInitParameter()方法是在GenericServlet接口中新定义的一个方法,用来调用初始化在web.xml中存放的参量。在web.xml配置文件中一个servlet中参量的初始化是使用
        <init-param>
        <param-name>name</param-name>
        <param-value>zhangsan</param-value>
        </init-param>
        来实现的。这里的参量只对这个servlet可用。

        如果通过在web.xml中的ServletContext上下文中定义参量,那么整个web应用程序中的servlet、jsp都可调用,web.xml中的格式为:
        <context-param>
        <param-name>test</param-name>
        <param-value>Is it me</param-value>
        <context-param>

<context-param>的作用:
web.xml的配置中<context-param>配置作用
1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个节点: <listener></listener> 和 <context-param></context-param>
2.紧接着,容器创建一个ServletContext(上下文),这个WEB项目所有部分都将共享这个上下文.
3.容器将<context-param></context-param>转化为键值对,并交给ServletContext.
4.容器创建<listener></listener>中的类实例,即创建监听.
5.在监听中会有contextInitialized(ServletContextEvent args)初始化方法,在这个方法中获得ServletContext = ServletContextEvent.getServletContext();
context-param的值 = ServletContext.getInitParameter("context-param的键");
6.得到这个context-param的值之后,你就可以做一些操作了.注意,这个时候你的WEB项目还没有完全启动完成.这个动作会比所有的Servlet都要早.
换句话说,这个时候,你对<context-param>中的键值做的操作,将在你的WEB项目完全启动之前被执行.
7.举例.你可能想在项目启动之前就打开数据库.
那么这里就可以在<context-param>中设置数据库的连接方式,在监听类中初始化数据库的连接.
8.这个监听是自己写的一个类,除了初始化方法,它还有销毁方法.用于关闭应用前释放资源.比如说数据库连接的关闭.
         */
        ServletConfig config = getServletConfig();
        String value = config.getInitParameter("name");//第一种方式
        String values = getInitParameter("name");//第二种方式
        System.out.println(value);
        System.out.println(values);
        ServletContext servletContext = getServletContext();
        String valuesss = servletContext.getInitParameter("names");
        System.out.println(valuesss);
    }
}

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

  <display-name>Archetype Created Web Application</display-name>

  <context-param><!--必须写在开头,其余地方报错-->
    <param-name>names</param-name>
    <param-value>卡卡</param-value>
  </context-param>
  <servlet>
    <servlet-name>C</servlet-name>
    <servlet-class>servlet.DemoCServlet</servlet-class>
    <init-param>
      <param-name>name</param-name>
      <param-value>哈哈</param-value>
    </init-param>

  </servlet>


  <servlet-mapping>
    <servlet-name>C</servlet-name>
    <url-pattern>/C</url-pattern>
  </servlet-mapping>

</web-app>

DemoDServlet.java

package servlet;

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;
@WebServlet("/D")
public class DemoDServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("ddddddd");
    }
}```


打印数据库中表userinfo的所有数据(jdbc过程省略)

UserServlet.java

```java
package servlet;

import bean.UserInfo;
import biz.UserBiz;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

public class UserServlet extends HttpServlet {
    private UserBiz ub = new UserBiz();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收请求:我需要用户信息
        List<UserInfo> list = ub.findAllUser();
        HttpSession session = req.getSession();
        session.setAttribute("USER_LIST",list);
        //作出响应
        resp.sendRedirect("index.jsp");
    }
}

index.jsp

<%@page language="java" isELIgnored="false" pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>//引入jstl标签
<html>
<head>
    <title>CRUD</title>
    <style>
        table{
            margin: auto;
            border: 1px gray solid;
            width: 70%;
        }
        th,td{
            border: 1px gray solid;
        }
    </style>
</head>
<c:if test="${empty sessionScope.USER_LIST}">
    <c:redirect url="userServlet"/>
</c:if>
<body>
<table>
    <tr>
        <th>序号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>住址</th>
    </tr>
    <!--var:迭代变量 items:取的东西 varStatus:自增的1,2,3...-->
    <c:forEach var="ui" items="${sessionScope.USER_LIST}" varStatus="j">
        <tr>
            <td>${j.count}</td>
            <td>${ui.userName}</td>
            <td>${ui.userSex}</td>
            <td>${ui.userAge}</td>
            <td>${ui.userAddress}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

web.xml

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

  <display-name>Archetype Created Web Application</display-name>
  <servlet>
    <servlet-name>userServlet</servlet-name>
    <servlet-class>servlet.UserServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>userServlet</servlet-name>
    <url-pattern>/userServlet</url-pattern>
  </servlet-mapping>

  <welcome-file-list><!--首界面显示-->
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值