Servlet要点、请求与响应
一: 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要点、请求与响应相关推荐
- Java web—Servlet的请求与响应
前言: 在家上网课快上疯了╰(‵□′)╯,上课连课本都没有,太难受了呜呜呜~, 只能在blog里记录一下这段时间的学习的内容,太难了- 一.servlet概述: 运行在WEB服务器端的 ...
- javaweb项目得执行过程及servlet得请求(Httprequest)和响应(Httpresponse)
javaweb项目的执行过程及servlet核心要点 1.javaWeb应用的结构 1.Java Resources :java代码 2.WebContent:资源文件 如:html css ...
- Servlet请求和响应总结
1.解决乱码问题 通过Request的设置编码表方法和Respose设置浏览器展示编码表解决 //设置请求字符编码,防止乱码 req.setCharacterEncoding("utf-8& ...
- Servlet之请求转发和响应重定向
多个servlet之间的跳转有两种方式: 请求转发:request.getRequestDispatcher("转发路径").forward(request, response); ...
- 【JavaLearn】#(23)JSP相关语法、HTTP协议、Servlet介绍、Servlet生命周期、请求和响应、相对路径、转发和重定向
1. JSP简单内容 1.1 JavaEE JavaEE 包含JSP JavaEE是一个开发分布式企业级应用的规范和标准.JavaEE包含之前学过的所有内容(JavaSE) 真正开发中,很少使用Jav ...
- Servlet生命周期及请求、响应
一.Servlet生命周期 Servlet运行在Servlet容器中,其生命周期由容器全盘控制.容器会创建请求和响应对象.为Servlet分配一个线程.调用servlet的service()方法,并传 ...
- servlet请求和响应的过程
1.加载 Servlet类被加载到Java虚拟机中,并且实例化.在这个过程中,web容器(例如tomcat)会调用Servlet类的公开无参构造函数,产生一个Servlet类的实例对象.默认情况下Se ...
- JAVA记录-Servlet RequestDispatcher请求转发
RequestDispatcher接口提供将请求转发送到另一个资源的功能,它可能是html,servlet或jsp等. 此接口也可用于包括另一资源的内容.它是servlet协作的一种方式. 在Requ ...
- 【SSM框架系列】SpringMVC的请求和响应
request和response request对象的作用 获取请求参数 作为域对象存取数据 获取请求头 请求转发 response功能 回写数据,JSON格式字符串 页面跳转(请求重定向) Spri ...
最新文章
- poj3177(双联通分量)
- python 读法-python 怎么读,python 怎么读
- python编写异常处理_Python 简明教程 --- 23,Python 异常处理
- OpenGL编程指南1:OpenGL简介
- app开发学习需要经历哪些流程
- 论文浅尝 | 利用图 Transformer 实现基于知识图谱的文本生成
- python2.7与3.7脚本转换_python 2.7 - python 3.7 升级记录
- 基于机器视觉的IC表面字符检测
- php html5 应用缓存,HTML5 应用程序缓存
- 修改Linux文件格式为unix
- 手把手教你通过PS给所需证件照进行换底色处理
- 移动终端开发工程师工作流程的总结
- 微信公众号关注渠道来源
- MATLAB 棋盘格图片校准
- 【UCOSii源码解析】任务管理
- 小程序 配置域名 业务域名_使域名成为您的业务
- [蓝桥杯]2020年第十一届省赛真题C/C++ B组(七月)
- Intellij idea Tips 之 创建文件自动生成文档描述
- Greenplum数据库故障分析——can not listen port
- 10 个 Python 可视化作品,今天源码全部开放下载!