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");
}
}
第二种实现方法:
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>