servlet概述
Servlet是Server Applet的简称,意思为用Java编写的服务器端的程序. 它运行在web服务器中,web服务器负责Servlet和客户的通信以及调用Servlet方法。
servlet的作用:
- 接收(浏览器)用户发送的请求数据
- 调用java程序来处理请求
- 根据处理结果,将结果响应给客户端
servlet创建和使用
1.创建一个类继承javax.servlet.http包下的HttpServlet
public class LoginServlet_back extends HttpServlet {
public LoginServlet_back(){
System.out.println("LoginServlet无参构造");
}
/*
在构造方法执行完成后立即执行,
用来初始化servlet,有一个ServletConfig的参数,封装servlet配置信息的
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init:"+config.getInitParameter("n"));
}
/*
service 为前端提供服务的,每次请求都会被访问
HttpServletRequest 表示请求,封装请求数据
HttpServletResponse 表示响应
jdbc 接口 mysql实现
tomcat运行java 接口 tomcat实现
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println(req);
System.out.println(resp);
System.out.println("service");
}
/*
在服务器关闭时,让我们的servlet程序可以去执行某些最终的操作(例如,最中将一些数据存储到数据库,打印日志)
*/
@Override
public void destroy() {
System.out.println("destroy");
}
}
2.web.xml文件中配置Servlet
web.xml: 存储我们自己项目的配置文件,在服务器启动时,由服务器加载读取配置servlet,过滤器,监听器…
<servlet>
<servlet-name>servlet名</servlet-name>
<servlet-class>servlet类地址</servlet-class>
</servlet>
<servlet-mapping>
<serlvet-name>servlet名</serlvet-name>
<url-pattern>servlet访问路径</url-pattern>
<!--servlet什么时候被创建 小于0-第一次访问时,大于等于0在服务器启动时-->
<load-on-startup>-1</load-on-startup>
</servlet-mapping>
3.运行servlet程序
通过浏览器访问http:127.0.0.1:8080/项目名/url
servlet的生命周期
构造方法:最先执行只被调用一次,只有第一次访问Servelt时或服务器启动时创建Servlet实例。
Init方法:只被调用一次,在Servlet实例创建好实例后立即执行,用于执行一些初始化Servlet的操作。
service方法:多次调用,每次请求都调用service方法,根据请求方式调用doGet()或doPost()方法。
destroy:只被调用一次,在服务器关闭时调用,执行一些操作。
创建实例->初始化->服务->消亡
一次http请求发送到后端找到Servlet程序,是按照一个特定顺序调用方法的,在哪儿规定的调用顺序,在最上层定义一
个Servlet接口(init,service,destroy),所有的javaEE(实现了Servlet接口的类)都会按照这个规范来执行.
http协议
超文本传输协议 (HyperText Transfer Protocol)服务器传输超文本到本地浏览器的传送协议,是互联网上应用最为流行的一种网络协议,用于定义客户端浏览器和服务器之间交换数据的过程。
HTTP是一个基于TCP/IP通信协议来传递数据.
http请求
http请求包括:
请求行:包含http请求方式,请求资源名称,http版本 .
请求头:包含主机地址,以及客户端的一些环境信息,以键值对的形式向后端传递.
请求体 :代表着浏览器在post请求方式中传递给服务器的参数,请求体中参数以键值形式传递,多个用&链接,服务器接收到后再解析
http的两种请求方式:
get:点击超链接,表单 method=“get”,直接在地址栏中输入地址
post:表单 method=“post”
区别:
get:主要用于从服务器获取数据,也是可以向服务器发送数据的,通过URL提交数据,数据在URL中可以看到,提交的数据大小受限制一般1kb.
post:主要是向服务器提交信息,数据放置在请求体中提交,不会显示在地址栏中相对安全,传输的数据量大,没有限制(可以通过post提交文件)
后端处理
由于前端发送的http请求有get和post两种,所以后端提供doGet()和doPost()进行对应的处理.虽然调用doget和
dopost方法,但是构造,init,service,destroy方法,仍然会正常执行. 当我们servlet中没有需要初始化的内容时,可以
不重写init(),但是服务器会依然调用父类中重写的init() 父类中已经重写了service(),并且根据请求方式进行了判
断,get–>doGet(),post–>doPost() 当我们servlet中没有需要最终执行的操作时,可以不重写destroy(),但是服务器
会依然调用父类中重写的destroy() 当一次http请求发送到服务器时,tomcat会将请求中所有的数据,都封装到一个
实现HttpServletRequest类的对象中. 使用此对象,就可以获取所有的请求数据.
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//接收请求数据(请求行,请求头)也可以在dopost方法中使用
System.out.println(req.getRequestURL());
System.out.println(req.getMethod());
System.out.println(req.getScheme());
System.out.println(req.getProtocol());
System.out.println(req.getRemoteAddr());//获得远端的ip和端口
System.out.println(req.getRemotePort());//客户端端口
System.out.println(req.getServerName());
System.out.println(req.getServerPort());
System.out.println(req.getHeader("User-Agent"));
//请求数据中,自己传递的
System.out.println(req.getParameter("name"));
System.out.println(req.getParameter("age"));
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/post数据在接收之前,需要设置一个解码规则
req.setCharacterEncoding("utf-8");
System.out.println(req.getParameter("account"));
System.out.println(req.getParameter("password"));
String [] hobbys = req.getParameterValues("hobby");
System.out.println(Arrays.toString(hobbys));
//响应
// resp.setContentType("text/html;charset=utf-8");
resp.setHeader("Content-Type", "text/html;charset=utf-8");//设置响应数据编码,在获得流对象之前设置
PrintWriter printWriter = resp.getWriter();
printWriter.print("提交成功"); //对象,集合,map-->json
}
过滤器
Filter也称之为过滤器,它是Servlet技术中最实用的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Servlet, 从而实现一些 特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
作用:对服务器web资源进行拦截(权限控制,通过拦截资源进行权限控制,是否可以访问)
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截
Servlet API 中,与过滤器有关的API共有三个接口,分别是 Filter 、FilterChain 、FilterConfig
过滤器的创建
1.创建一个类实现
public class EncodFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
//filterChain过滤链, 处理完后,让请求继续向下执行,下一个可能是目标servlet,也可能是下一个过滤器
filterChain.doFilter(servletRequest,servletResponse);
}
}
doFilter方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法。方法体中可以对
request 和response进行预处理。其中FilterChain可以将处理后的request 和response对象传递到过滤链上的下
一个资源。
2.在 web.xml中配置过滤器
<filter>
<filter-name>encod</filter-name>
<filter-class>com.ffyc.webback.filter.EncodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encod</filter-name>
<url-pattern>/*</url-pattern><!--配置哪些请求地址进入到编码过滤器-->
</filter-mapping>
过滤器用来实现通用的功能,减少代码冗余,提高可维护性 ,一个过滤器可以配置给多个资源使用 ,一个资源也可以配置多个过滤器,按照配置顺序调用