servlet是在jsp技术出来之前用来动态生成web页面的,它与jsp的区别在于 jsp是html嵌套java代码,而servlet是java代码嵌套html。所以一般重定向到验证登陆等,都推荐用servlet。不建议用jsp。
servlet是server以及applet两个单词的合成,所以它是一种服务器端的java应用程序。但并不是所有服务器端的java的应用程序都是servlet。只有当服务器端配置使用Servlet API时,才能算是一个Servlet。
那么下面就开始创建servlet,在myeclipse和idea里面可以直接创建servlet,不必要冲动去当前web下面的xml里手动创建
必须实现doPost和doGet的方法,从字面意思来理解, post就是form表单中method的提交方式。 doPost就是获取提交方式为Post的值。一般来说我们都是直接在 d oGet的方法不写任何东西,直接调用doPost的方法,如:
index.html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action=" /servlet/loginServlet" method="get"> <!-- 这里跳转的servlet的地址,xml里面的地址。若myeclipse则需要的地址为 /项目名/servlet/LoginServlet 项目名前面的"/"不能去掉,否则报错。idea则不需要添加项目名 -->
<p>用户名:<input type="text" name="user"></p>
<p>密码:<input type="password" name="pwd"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
loginServlet页面:
public class loginServlet extends HttpServlet { <!-- 我创建一个叫MyServlet的Servlet-->
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("user");
String pwd=request.getParameter("pwd");
User user=new User(name,pwd);
UserDao ud=new UserDao(); <!--实例化这个对象,里面有一个返回布尔值的方法,用来判断该用户的用户名和密码-->
if(ud.panDuan(user)){ <!--该方法是若用户是admin且密码为123456那么返回true,否则false-->
response.sendRedirect(" /servlet/goodsServlet"); <!-- 跳转到该servlet里xml的地址-->
}else{
response.sendRedirect("../index.html");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
GoodsServlet的页面:
public class GoodsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
GoodsDao gd=new GoodsDao();<!--该对象的方法存储有多条数据-->
List<Goods> lg= gd.catchList(); <!--把多条数据存入集合-->
request.getSession().setAttribute("goodsl",lg); <!-- request.getSession就等于当前的Session对象,再通过其存放数据-->
response.sendRedirect("../bb.jsp"); <!--重定向到显示页面-->
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
由于表单中若不设置method属性,会默认采用get提交。而且这样就可以直接写一次代码,两个提交方式都能使用了。
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 绿色底色的是一个完整的servlet,每次新建完项目后,必须在这里添加对应的servlet-->
<!-- 若myeclipse则会自动生成下面代码,idea不会,若修改和删除Servlet文件,那么xml的文件是不会自动修改的,需要自己手动修改-->
<servlet> <!--这是第一个Servlet的配置,每个Servlet的配置都不同,这是loginServlet的配置-->
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>loginServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>com.bdqn.servlet.loginServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!-->
<servlet-name>loginServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern> /servlet/loginServlet </url-pattern>
</servlet-mapping>
<servlet> <!--这是第二个Servlet的配置,每个Servlet的配置都不同,这是goodsServlet的配置 -->
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>goodsServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>com.bdqn.servlet.GoodsServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>goodsServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/servlet/goodsServlet</url-pattern>
</servlet-mapping>
</web-app>
bb.jsp的页面
<%--
Created by IntelliJ IDEA.
User: 78241
Date: 2018/7/6
Time: 14:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>登陆成功</p>
<c:forEach var="dd" items="${goodsl}" varStatus="num"> <!--使用JSTL和EL表达式混合遍历显示传过来的集合-->
编号:${dd.goodsNum} 商品名称:${dd.goodsName} 商品价格:${dd.price} <br>
</c:forEach>
</body>
</html>
1.用户访问web资源时,发送的请求会先经过过滤器
2.由过滤器怼请求数进行过过滤处理
3.经过过滤的请求数据被发送至目标资源进行处理
4.目标资源处理后的响应被发送到过滤器
5.经过过滤器的过滤后,将相应返回给客户端
过滤器可以存在多个,若有多个,顺序是从上往下依次执行,谁在xml文件里靠上的,谁就先运行。
过滤器的创建步骤 :
import java.io.IOException;
public class Myfilter implements Filter { <--!实现Filter-->
@Override
public void init(FilterConfig filterConfig) throws ServletException { <!--过滤器的初始化-->
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { <!--过滤器的执行过滤,下面的代码是处理中文乱码问题的方法之一-->
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
System.out.print("经过过滤器了");
filterChain.doFilter(servletRequest,servletResponse); <!--这句话必须要有,其原因是这代码就是过滤器过滤的操作, 通过该方法设置了编码格式之后再用doFilter方法把request和response传进去,让程序继续往下执行-->
}
@Override
public void destroy() { <!--过滤器的销毁-->
}
}
<!-- Filter的名字 -->
<filter-name> myfilter</filter-name> <!-- 自己起过滤器的名字-->
<!-- Filter的实现类 -->
<filter-class>com.bdqn.filter.Myfilter</filter-class> <!-- 过滤器的位置-->
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name> myfilter</filter-name> <!-- 与上面自己其的过滤器名字必须一致-->
<!-- Filter负责拦截的URL -->
<url-pattern>/*</url-pattern> <!--现在使用过的是全部匹配,即所有web资源都会被过滤器过滤-->
<!--精准匹配 里面的"/*"修改成对应的web名称-->
<!--目录匹配,例:/admin/* 这代表着admin目录下的所有web项目都被过滤-->
<!--扩展名匹配 *.XX扩展名-->
</filter-mapping>
完成了上面步骤之后,系统就会自动给调用相应的过滤器执行过滤功能。
这个servlet与filter(监听器)的生命周期如下:
init() →这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。
service() →判断表单提交的方式是get还是post,并且创建doget() 和dopost()
destroy()→当程序死亡时运行,意思时销毁该程序,结束生命周期
注意:init与destroy只执行一次。例如servlet容器会查找对应servlet,若没有则创建,若有则直接引用。destroy同理。
servlet是server以及applet两个单词的合成,所以它是一种服务器端的java应用程序。但并不是所有服务器端的java的应用程序都是servlet。只有当服务器端配置使用Servlet API时,才能算是一个Servlet。
名称 | 说明 | 所在包 |
Servlet接口 | Java Servlet的基础接口,定义了Servlet必须实现的方法 | javax.servlet |
GenericServlet类 | 继承自Servlet接口,属于通用的,不依赖于协议的Servlet | javax.servlet |
HttpServlet类 | 继承自GenericServlet类,是在其基础上扩展了HTTP协议的Servlet | javax.servlet.http |
HttpServletRequest接口 | 继承自ServletRequest接口,用于获取请求数据 | javax.servlet.http |
HttpServletResponse接口 | 继承自ServletResponse接口,用于返回相应数据 | javax.servlet.http |
那么运行servlet有两个步骤,第一创建servlet并写入判断方法,第二在对应目录下web.xml里面写入配置
第一步,创建servlet
idea创建页面![](https://i-blog.csdnimg.cn/blog_migrate/8993044f35683942354f67747e4ba3fb.png)
必须实现doPost和doGet的方法,从字面意思来理解, post就是form表单中method的提交方式。 doPost就是获取提交方式为Post的值。一般来说我们都是直接在 d oGet的方法不写任何东西,直接调用doPost的方法,如:
index.html页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action=" /servlet/loginServlet" method="get"> <!-- 这里跳转的servlet的地址,xml里面的地址。若myeclipse则需要的地址为 /项目名/servlet/LoginServlet 项目名前面的"/"不能去掉,否则报错。idea则不需要添加项目名 -->
<p>用户名:<input type="text" name="user"></p>
<p>密码:<input type="password" name="pwd"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
loginServlet页面:
public class loginServlet extends HttpServlet { <!-- 我创建一个叫MyServlet的Servlet-->
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name=request.getParameter("user");
String pwd=request.getParameter("pwd");
User user=new User(name,pwd);
UserDao ud=new UserDao(); <!--实例化这个对象,里面有一个返回布尔值的方法,用来判断该用户的用户名和密码-->
if(ud.panDuan(user)){ <!--该方法是若用户是admin且密码为123456那么返回true,否则false-->
response.sendRedirect(" /servlet/goodsServlet"); <!-- 跳转到该servlet里xml的地址-->
}else{
response.sendRedirect("../index.html");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
GoodsServlet的页面:
public class GoodsServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
GoodsDao gd=new GoodsDao();<!--该对象的方法存储有多条数据-->
List<Goods> lg= gd.catchList(); <!--把多条数据存入集合-->
request.getSession().setAttribute("goodsl",lg); <!-- request.getSession就等于当前的Session对象,再通过其存放数据-->
response.sendRedirect("../bb.jsp"); <!--重定向到显示页面-->
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
由于表单中若不设置method属性,会默认采用get提交。而且这样就可以直接写一次代码,两个提交方式都能使用了。
第二步,web.xml的配置
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!-- 绿色底色的是一个完整的servlet,每次新建完项目后,必须在这里添加对应的servlet-->
<!-- 若myeclipse则会自动生成下面代码,idea不会,若修改和删除Servlet文件,那么xml的文件是不会自动修改的,需要自己手动修改-->
<servlet> <!--这是第一个Servlet的配置,每个Servlet的配置都不同,这是loginServlet的配置-->
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>loginServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>com.bdqn.servlet.loginServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!-->
<servlet-name>loginServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern> /servlet/loginServlet </url-pattern>
</servlet-mapping>
<servlet> <!--这是第二个Servlet的配置,每个Servlet的配置都不同,这是goodsServlet的配置 -->
<!-- servlet的内部名称,自定义。尽量有意义 -->
<servlet-name>goodsServlet</servlet-name>
<!-- servlet的类全名: 包名+简单类名 -->
<servlet-class>com.bdqn.servlet.GoodsServlet</servlet-class>
</servlet>
<!-- servlet的映射配置 -->
<servlet-mapping>
<!-- servlet的内部名称,一定要和上面的内部名称保持一致!! -->
<servlet-name>goodsServlet</servlet-name>
<!-- servlet的映射路径(访问servlet的名称) -->
<url-pattern>/servlet/goodsServlet</url-pattern>
</servlet-mapping>
</web-app>
bb.jsp的页面
<%--
Created by IntelliJ IDEA.
User: 78241
Date: 2018/7/6
Time: 14:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<p>登陆成功</p>
<c:forEach var="dd" items="${goodsl}" varStatus="num"> <!--使用JSTL和EL表达式混合遍历显示传过来的集合-->
编号:${dd.goodsNum} 商品名称:${dd.goodsName} 商品价格:${dd.price} <br>
</c:forEach>
</body>
</html>
过滤器filter
过滤器的工作原理:1.用户访问web资源时,发送的请求会先经过过滤器
2.由过滤器怼请求数进行过过滤处理
3.经过过滤的请求数据被发送至目标资源进行处理
4.目标资源处理后的响应被发送到过滤器
5.经过过滤器的过滤后,将相应返回给客户端
过滤器可以存在多个,若有多个,顺序是从上往下依次执行,谁在xml文件里靠上的,谁就先运行。
过滤器的创建步骤 :
1.为了规范在项目里面新建对应的filter包,里面创建一个java文件。该文件实现Filter(位于javax.servlet包)
import javax.servlet.*;import java.io.IOException;
public class Myfilter implements Filter { <--!实现Filter-->
@Override
public void init(FilterConfig filterConfig) throws ServletException { <!--过滤器的初始化-->
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { <!--过滤器的执行过滤,下面的代码是处理中文乱码问题的方法之一-->
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
System.out.print("经过过滤器了");
filterChain.doFilter(servletRequest,servletResponse); <!--这句话必须要有,其原因是这代码就是过滤器过滤的操作, 通过该方法设置了编码格式之后再用doFilter方法把request和response传进去,让程序继续往下执行-->
}
@Override
public void destroy() { <!--过滤器的销毁-->
}
}
2.与servlet一样,也必须在xml里面进行配置,在web-app标签的范围内写入下面的代码
<filter><!-- Filter的名字 -->
<filter-name> myfilter</filter-name> <!-- 自己起过滤器的名字-->
<!-- Filter的实现类 -->
<filter-class>com.bdqn.filter.Myfilter</filter-class> <!-- 过滤器的位置-->
</filter>
<!-- 定义Filter拦截的URL地址 -->
<filter-mapping>
<!-- Filter的名字 -->
<filter-name> myfilter</filter-name> <!-- 与上面自己其的过滤器名字必须一致-->
<!-- Filter负责拦截的URL -->
<url-pattern>/*</url-pattern> <!--现在使用过的是全部匹配,即所有web资源都会被过滤器过滤-->
<!--精准匹配 里面的"/*"修改成对应的web名称-->
<!--目录匹配,例:/admin/* 这代表着admin目录下的所有web项目都被过滤-->
<!--扩展名匹配 *.XX扩展名-->
</filter-mapping>
完成了上面步骤之后,系统就会自动给调用相应的过滤器执行过滤功能。
生命周期:
当我们的web项目首次被访问时是不会创建servlet的。当需要调用该servlet时,该servlet才会被创建。之后该servlet的生命周期是从被创建到服务器关闭。这个servlet与filter(监听器)的生命周期如下:
init() →这是Servlet过滤器的初始化方法,Servlet容器创建Servlet过滤器实例后将调用这个方法。在这个方法中可以读取web.xml文件中Servlet过滤器的初始化参数。
service() →判断表单提交的方式是get还是post,并且创建doget() 和dopost()
destroy()→当程序死亡时运行,意思时销毁该程序,结束生命周期
注意:init与destroy只执行一次。例如servlet容器会查找对应servlet,若没有则创建,若有则直接引用。destroy同理。