一: Servlet要点

01.Servlet规范和搭建JavaWeb项目

什么是Service:Service是JavaEE的组件,service是一个程序类,要求必须实现javax.service.Service接口.也是JavaEE中的规范.服务器其实是Service的实现,搭建标准的JavaWeb的项目结构:1.创建一个java项目:HelloServletWeb:2.在HelloServletWeb中创建一个文件夹webapp,表示web项目的根;3.在webAPP中创建WEB-INF文件夹,4.在WEB-INF中创建文件夹:lib,classes5.在WEB-INF中去Tomcat根/conf拷贝web.xml文件,只需要保留根元素.6.把当前项目的classpath路径改成webapp/WEB-INF下的classes中.

02.第一个Servlet的程序

Service的第一个程序编写步骤:1):拷贝Tomcat根/lib/servlet-api.jar到项目的WEB-INF/lib目录中,并做build path.2):编写Servlet程序,使之实现javax.servlet.Servlet接口,并覆盖接口中的方法.public class HelloServlet implement javax.servlet.Servilet(...实现方法...)3):发现方法中的参数出现arg0,arg1的情况是因为没有关联Servlet的源代码.是否关联源代码和程序最终的运行没有关系,只是在开发阶段参数美观,可阅读源代码.4):在service(ServletRequest req, ServletResponse res)方法,打印一句话.引导:此时HelloServlet类,和Tomcat一点关系都没有:我们需要告诉Tomcat来帮我们管理HelloServlet类,(Tomcat是Servlet的容器,会负责Servlet对象的声明)所以,得以配置的形式,告诉Tomcat来帮我们管理自定义的Servlet类.5):Servlet配置:在web.xml文件中的配置,切记<url-pattern>/hello</url-pattern>中的hello要加"/"6):部署项目并访问:server.xml中:<Context docBase="D:\Java EE\Servlet\webapp" path="day3">访问:http://ip:port/contextPath/资源名http://localhost:80/day3/hello

03.Servlet的生命周期方法

Servlet的生命周期:创建对象,初始化操作,运行操作,销毁操作.javax.servlet.Servlet接口中的方法:String getServletInfo():获取Servlet的信息(Servlet的作者,版本,版权相关).ServletConfig getServletConfig();获取Servlet的配置信息对象.生命周期方法:在WEB的生命周期中(Tomcat启动-->Tomcat关闭),Servlet是单例的.构造器:在服务端程序第一次被请求的时候,调用,只被调用一次.void init(ServletConfig config);在构造器执行完毕之后,调用init方法,也只会执行一次.void service(ServletRequest req, ServletResponse resp):每一次请求都会执行该方法.void destroy();正常关闭Tomcat才会执行(该方法不一定会被执行,我们没有必要在其中编写扫尾的操作).总结:   构造器--->init方法---> {servlet方法}循环 ---->destory方法注意: 1):Servlet类的构造器必须使用public修饰.2):Servlet类必须是无参数构造器.原因:底层创建Servlet对象:class.newInstance()方式.--->公共的无参数构造器.总结:保证Servlet必须有一个公共的无参数构造器,方便Tomcat底层创建Servlet的对象.

04.Servlet的请求流程-图片版

![Servlet的请求流程图](https://img-blog.csdn.net/20180214221646461?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzQwMTYxNzA4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)

05.Servlet的请求流程-文字版

    1:浏览器先发送请求:http://localhost:80/day3/hello2:DNS解析域名(忽略)3:Tomcat解析请求:/day3/hello.  上下文路径:/day3   资源的名称/hello4:解析Tomcat根/conf/server.xml文件,获取其中所有的<Context/>元素,并找到path属性为/day3的元素.<Content docBase="D:\Java EE\Servlet\webapp" path="day3"/>.再读取该<Content/>元素,再获取docBase属性值,该属性值就是当前访问的WEB项目的根路径.5:从该web的根路径/WEB-INF下找到web.xml文件.6:读取web.xml文件,获取所有的<url-patten>元素,并判断哪一个<url-pattern>的文本内容为:/hello.找不到:报404错误.    找到:GOTO  7.7:通过/hello ,找到当前Servlet的全限定名:com._520it._01_hello.HelloServlet8:从Servlet的实例缓存池中去获取com._520it._01_hello.HelloServlet对应的对象Map<String,Servlet> cache = ....;Servlet obj = cache.get("com._520it._01_hello.HelloServlet");if(obj==null){//第一次请求:GOTO 9}else{//非第一次请求:GOTO 12}9:使用反射创建Servlet对象.Servlet obj = Class.forName("com._520it._01_hello.HelloServlet").newInstance();10:把创建的Servlet对象,存储到Servlet实例缓存池中,供下一次请求使用.cache.put("com._520it._01_hello.HelloServlet",obj);11:容器创建ServletConfig对象,并调用init方法,来完成初始化操作.obj.init(config);12:容器创建ServletRequest和ServletResponse对象,并调用service方法.obj.service(req,resp);13:在service方法中对,当前请求的客户端做响应

06.ServletConfig接口获取初始化参数

ServletConfig接口:表示Servlet的信息配置对象(web.xml中,当前Servlet的配置信息).其中方法:String getServletName();获取当前Servlet的名字,<servlet-name>元素的文本内容.ServletContext getServletContext();获取当前Servlet的指定的参数名获取初始化参数值.Enumeration<String> getInitParameterName();获取当前Servlet的所有初始化参数的名字.

07.Servlet继承体深入讲解系列

public class Servlet1 extends MyHttpServlet{private static final long serialVersionUID = 1L;public void service(HttpServletRequest req, HttpServletResponse resp) {super.service(req, resp);System.out.println("utf");}
}
public class MyHttpServlet extends MyGenericServlet{private static final long serialVersionUID = 1L;//只能处理一般的请求public void service(ServletRequest req, ServletResponse resp){HttpServletRequest request = (HttpServletRequest) req;HttpServletResponse response = (HttpServletResponse) resp;service(request,response);//获取请求方式,GET/POST}//专门处理Http的请求public void service(HttpServletRequest req, HttpServletResponse resp){String method = req.getMethod();//获取请求方式,GET/POSTif("GET".equals(method)){doGet(req,resp);}else{doPost(req,resp);}}//专门用于处理POST请求private void doPost(HttpServletRequest req, HttpServletResponse resp) {System.out.println("Servlet1.doPost()");}//专门用于处理GET请求private void doGet(HttpServletRequest req, HttpServletResponse resp) {System.out.println("Servlet1.doGet()");}
}
abstract public class MyGenericServlet implements Serializable,Servlet,ServletConfig{private static final long serialVersionUID = 1L;private ServletConfig config = null;public void init(ServletConfig config) throws ServletException {this.config = config;this.init();}//专门暴露给子类,让子类编写自身的初始化代码public void init(){//NO OP}@Overrideabstract public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException;//把ServletConfig对象暴露给子类访问public ServletConfig getServletConfig() {return this.config;}public String getServletInfo() {return null;}public void destroy() {}public String getServletName() {return config.getServletName();}public ServletContext getServletContext() {return config.getServletContext();}public String getInitParameter(String name) {return config.getInitParameter(name);}public Enumeration<String> getInitParameterNames() {return config.getInitParameterNames();}
}

8.Servlet继承体系总结和开发Servlet

![servlet的继承体系图](https://img-blog.csdn.net/20180215180723738?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzQwMTYxNzA4/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)前端web实际开发的时候只需继承HttpServlet类,调用service()方法,并记得删除方法中的super.service(req,resp);

9.HttpServletRequest接口和常用方法

    String getInitParameter(String name):获取初始化参数,初始化参数是开发人员设置的String getParameter(String name):获取用户输入的参数,参数是不同的用户输入的(通过表单) 常用方法:01.String getMethod():返回请求方式:如GET/POST  只有表单中method=post才是post02.String getRequestURI();返回请求行中的资源名字部分:如/test/index.html03.StringBuffer getRequestURL():返回浏览器地址栏中所有的信息04.String getContextPath():返回当前项目的上下文路径(<Context/>元素的path属性值.)05.String getRemoteAddr():返回发出请求的客户机的IP地址06.String getHeader(String name):返回指定名称的请求头的值获取请求参数的方法:01.String getParameter(String name):返回指定参数名字的值02.String[] getParameterValues(String name):返回指定名字参数的多个参数值.03.Enumeration<String> getParameterNames()返回所有的参数名的Enumeration对象04.Map<String,String[]> getParameterMap():返回所有的参数和值所组成的Map对象.

10.处理请求中文乱码问题

    在Tomcat中,对于POST和GET请求,都默认才有ISO-8859-1的编码方式.而ISO-8850-1不支持中文,所以乱码.解决方案:1:按照ISO-8859-1把乱码恢复成二进制形式byte[] data = username.getBytes("ISO-8859-1");2:再把二进制形式的数据使用UTF-8重新编写String username = new String(data,"UTF-8");一个参数需要使用两行代码来转码,如果有N个参数,需要转N次代码重复.解决方案:针对于POST的请求方式: req.setCharacterEncoding("UTF-8");注意:1.只对POST有效. 2:必须放在获取任意参数之前.针对于GET的请求方式:修改Tomcat中的server.xml配置文件,对GET方式的默认编码.URIEncoding="ISO-8859-1"改为"UTF-8"

11.HttpServletResponse接口和常用方法

    ServletResponse接口:响应对象.封装了获取响应信息的方法.HttpServletResponse接口:ServletResponse的子接口,可以处理HTTP响应的方法.常用方法:01.OutputStream getOutputStream();获取字节输出流对象.   输出图片等注意:可以一起输出多个getOutputStream(),但是不可以跟getWriter()一起使用:02.PrintWriter getWriter():获取字符流输出对象      输出英文或者中文等03.设置输出数据的MIME类型:resp.setContentType("text/html");04.设置输出数据的编码方式:resp.setCharacterEncoding("UTF-8");可以将上述3,4两行代码合并成一行代码:resp.setContentType("text/html;charset=UTF-8");注意:必须先设置MIME类型和编码,再获取输出流,否则没有效果.

12.网页版的简易计算器

静态网页版

<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>Insert title here</title>
</head>
<body><form action='/cal' method='post'><input type='number' name='num1' /><select name='op'><option>+</option><option>-</option><option>*</option><option>/</option></select><input type='number' name='num2' /><input type='submit' value=' = '/>  <input type='text' value='' disabled /></form>
</body>
</html>

动态的Servlet网页

public class CalServlet extends HttpServlet{private static final long serialVersionUID = 1L;protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");PrintWriter out = resp.getWriter();//================================//2:接受表单中的数据String snum1 = req.getParameter("num1");String op = req.getParameter("op");String snum2 = req.getParameter("num2");String result = "";if(haslength(snum1) && haslength(snum2)){Integer num1 = Integer.valueOf(snum1);Integer num2 = Integer.valueOf(snum2);if("+".equals(op)){result = num1+num2+"";}else if("-".equals(op)){result = num1*num2+"";}}//================================//1:输出一个计算器的界面out.print("<form action='/cal' method='post'>");out.print("<input type='number' name='num1' value='"+snum1+"'/>");out.print("<select name='op'>");out.print("<option>+</option>");out.print("<option>-</option>");out.print("<option>*</option>");out.print("<option>/</option>");out.print("</select>");out.print("<input type='number' name='num2' value='"+snum2+"'/>");out.print("<input type='submit' value=' = ' />");out.print("<input type='text' value='"+result+"' disabled/>");}private boolean haslength(String str){return str!=null && !"".equals(str.trim());}
}

Servlet要点、请求与响应相关推荐

  1. Java web—Servlet的请求与响应

    前言:         在家上网课快上疯了╰(‵□′)╯,上课连课本都没有,太难受了呜呜呜~, 只能在blog里记录一下这段时间的学习的内容,太难了- 一.servlet概述: 运行在WEB服务器端的 ...

  2. javaweb项目得执行过程及servlet得请求(Httprequest)和响应(Httpresponse)

    javaweb项目的执行过程及servlet核心要点 1.javaWeb应用的结构 ​ 1.Java Resources :java代码 ​ 2.WebContent:资源文件 如:html css ...

  3. Servlet请求和响应总结

    1.解决乱码问题 通过Request的设置编码表方法和Respose设置浏览器展示编码表解决 //设置请求字符编码,防止乱码 req.setCharacterEncoding("utf-8& ...

  4. Servlet之请求转发和响应重定向

    多个servlet之间的跳转有两种方式: 请求转发:request.getRequestDispatcher("转发路径").forward(request, response); ...

  5. 【JavaLearn】#(23)JSP相关语法、HTTP协议、Servlet介绍、Servlet生命周期、请求和响应、相对路径、转发和重定向

    1. JSP简单内容 1.1 JavaEE JavaEE 包含JSP JavaEE是一个开发分布式企业级应用的规范和标准.JavaEE包含之前学过的所有内容(JavaSE) 真正开发中,很少使用Jav ...

  6. Servlet生命周期及请求、响应

    一.Servlet生命周期 Servlet运行在Servlet容器中,其生命周期由容器全盘控制.容器会创建请求和响应对象.为Servlet分配一个线程.调用servlet的service()方法,并传 ...

  7. servlet请求和响应的过程

    1.加载 Servlet类被加载到Java虚拟机中,并且实例化.在这个过程中,web容器(例如tomcat)会调用Servlet类的公开无参构造函数,产生一个Servlet类的实例对象.默认情况下Se ...

  8. JAVA记录-Servlet RequestDispatcher请求转发

    RequestDispatcher接口提供将请求转发送到另一个资源的功能,它可能是html,servlet或jsp等. 此接口也可用于包括另一资源的内容.它是servlet协作的一种方式. 在Requ ...

  9. 【SSM框架系列】SpringMVC的请求和响应

    request和response request对象的作用 获取请求参数 作为域对象存取数据 获取请求头 请求转发 response功能 回写数据,JSON格式字符串 页面跳转(请求重定向) Spri ...

最新文章

  1. poj3177(双联通分量)
  2. python 读法-python 怎么读,python 怎么读
  3. python编写异常处理_Python 简明教程 --- 23,Python 异常处理
  4. OpenGL编程指南1:OpenGL简介
  5. app开发学习需要经历哪些流程
  6. 论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成
  7. python2.7与3.7脚本转换_python 2.7 - python 3.7 升级记录
  8. 基于机器视觉的IC表面字符检测
  9. php html5 应用缓存,HTML5 应用程序缓存
  10. 修改Linux文件格式为unix
  11. 手把手教你通过PS给所需证件照进行换底色处理
  12. 移动终端开发工程师工作流程的总结
  13. 微信公众号关注渠道来源
  14. MATLAB 棋盘格图片校准
  15. 【UCOSii源码解析】任务管理
  16. 小程序 配置域名 业务域名_使域名成为您的业务
  17. [蓝桥杯]2020年第十一届省赛真题C/C++ B组(七月)
  18. Intellij idea Tips 之 创建文件自动生成文档描述
  19. Greenplum数据库故障分析——can not listen port
  20. 10 个 Python 可视化作品,今天源码全部开放下载!

热门文章

  1. HTML5特性system,HTML5教程 FileSystemAPI整理
  2. 红帽 安装oracle11g,64位RedHat 5.6下安装Oracle 11g
  3. K8s与Docker
  4. MySQL高级-触发器
  5. .Net Core项目 Encoding不全问题
  6. Oracle总结第一篇【基本SQL操作】
  7. java 注解(annotation)基础学习
  8. 安卓学习第一课——电话拨号器
  9. 解决outlook不能显示鼠标问题
  10. 南华桌面计算机,南华大学计算机应用基础试题题.doc