当前位置: 首页 > news >正文

常用的英文网站字体个人养老金查询

常用的英文网站字体,个人养老金查询,做兼职调查哪个网站好,专门做产品推广ppt的网站##RequestResponse 1#xff0c;Request和Response的概述 Request是请求对象#xff0c;Response是响应对象。这两个对象在我们使用Servlet的时候有看到#xff1a; 此时#xff0c;我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请…##RequestResponse 1Request和Response的概述 Request是请求对象Response是响应对象。这两个对象在我们使用Servlet的时候有看到 此时我们就需要思考一个问题request和response这两个参数的作用是什么? request:获取请求数据 浏览器会发送HTTP请求到后台服务器[Tomcat]HTTP的请求中会包含很多请求数据[请求行请求头请求体]后台服务器[Tomcat]会对HTTP请求中的数据进行解析并把解析结果存入到一个对象中所存入的对象即为request对象所以我们可以从request对象中获取请求的相关参数获取到数据后就可以继续后续的业务比如获取用户名和密码就可以实现登录操作的相关业务 response:设置响应数据 业务处理完后后台就需要给前端返回业务处理的结果即响应数据把响应数据封装到response对象中后台服务器[Tomcat]会解析response对象,按照[响应行响应头响应体]格式拼接结果浏览器最终解析结果把内容展示在浏览器给用户浏览 对于上述所讲的内容我们通过一个案例来初步体验下request和response对象的使用。 WebServlet(/demo3) public class ServletDemo3 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//使用request对象 获取请求数据String name request.getParameter(name);//url?namezhangsan//使用response对象 设置响应数据response.setHeader(content-type,text/html;charsetutf-8);response.getWriter().write(h1name,欢迎您/h1);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(Post...);} }启动成功后就可以通过浏览器来访问并且根据传入参数的不同就可以在页面上展示不同的内容: 小结 在这节中我们主要认识了下request对象和reponse对象: request对象是用来封装请求数据的对象response对象是用来封装响应数据的对象 目前我们只知道这两个对象是用来干什么的那么它们具体是如何实现的就需要我们继续深入的学习。接下来就先从Request对象来学习,主要学习下面这些内容: request继承体系 request获取请求参数 request请求转发 2Request对象 2.1 Request继承体系 在学习这节内容之前我们先思考一个问题前面在介绍Request和Reponse对象的时候比较细心的同学可能已经发现 当我们的Servlet类实现的是Servlet接口的时候service方法中的参数是ServletRequest和ServletResponse当我们的Servlet类继承的是HttpServlet类的时候doGet和doPost方法中的参数就变成HttpServletRequest和HttpServletReponse 那么 ServletRequest和HttpServletRequest的关系是什么?request对象是有谁来创建的?request提供了哪些API,这些API从哪里查? 首先我们先来看下Request的继承体系: 从上图中可以看出ServletRequest和HttpServletRequest都是Java提供的所以我们可以打开JavaEE提供的API文档[参考: 资料/JavaEE7-api.chm],打开后可以看到: 所以ServletRequest和HttpServletRequest是继承关系并且两个都是接口接口是无法创建对象这个时候就引发了下面这个问题: 这个时候我们就需要用到Request继承体系中的RequestFacade: 该类实现了HttpServletRequest接口也间接实现了ServletRequest接口。Servlet类中的service方法、doGet方法或者是doPost方法最终都是由Web服务器[Tomcat]来调用的所以Tomcat提供了方法参数接口的具体实现类并完成了对象的创建要想了解RequestFacade中都提供了哪些方法我们可以直接查看JavaEE的API文档中关于ServletRequest和HttpServletRequest的接口文档因为RequestFacade实现了其接口就需要重写接口中的方法 对于上述结论要想验证可以编写一个Servlet在方法中把request对象打印下就能看到最终的对象是不是RequestFacade,代码如下: WebServlet(/demo2) public class ServletDemo2 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(request);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} }启动服务器运行访问http://localhost:8080/request-demo/demo2,得到运行结果: 小结 Request的继承体系为ServletRequest–HttpServletRequest–RequestFacadeTomcat需要解析请求数据封装为request对象,并且创建request对象传递到service方法使用request对象可以查阅JavaEE API文档的HttpServletRequest接口中方法说明 2.2 Request获取请求数据 HTTP请求数据总共分为三部分内容分别是请求行、请求头、请求体对于这三部分内容的数据分别该如何获取首先我们先来学习请求行数据如何获取? 2.2.1 获取请求行数据 请求行包含三块内容分别是请求方式、请求资源路径、HTTP协议及版本 对于这三部分内容request对象都提供了对应的API方法来获取具体如下: 获取请求方式: GET String getMethod()获取虚拟目录(项目访问路径): /request-demo String getContextPath()获取URL(统一资源定位符): http://localhost:8080/request-demo/req1 StringBuffer getRequestURL()获取URI(统一资源标识符): /request-demo/req1 String getRequestURI()获取请求参数(GET方式): usernamezhangsanpassword123 String getQueryString()介绍完上述方法后咱们通过代码把上述方法都使用下: /*** request 获取请求数据*/ WebServlet(/req1) public class RequestDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// String getMethod()获取请求方式 GETString method req.getMethod();System.out.println(method);//GET// String getContextPath()获取虚拟目录(项目访问路径)/request-demoString contextPath req.getContextPath();System.out.println(contextPath);// StringBuffer getRequestURL(): 获取URL(统一资源定位符)http://localhost:8080/request-demo/req1StringBuffer url req.getRequestURL();System.out.println(url.toString());// String getRequestURI()获取URI(统一资源标识符) /request-demo/req1String uri req.getRequestURI();System.out.println(uri);// String getQueryString()获取请求参数GET方式 usernamezhangsanString queryString req.getQueryString();System.out.println(queryString);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} }启动服务器访问http://localhost:8080/request-demo/req1?usernamezhangsanpasswrod123获取的结果如下: 2.2.2 获取请求头数据 对于请求头的数据格式为key: value如下: 所以根据请求头名称获取对应值的方法为: String getHeader(String name)接下来在代码中如果想要获取客户端浏览器的版本信息则可以使用 /*** request 获取请求数据*/ WebServlet(/req1) public class RequestDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求头: user-agent: 浏览器的版本信息String agent req.getHeader(user-agent);System.out.println(agent);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} } 重新启动服务器后http://localhost:8080/request-demo/req1?usernamezhangsanpasswrod123获取的结果如下: 2.2.3 获取请求体数据 浏览器在发送GET请求的时候是没有请求体的所以需要把请求方式变更为POST请求体中的数据格式如下: 对于请求体中的数据Request对象提供了如下两种方式来获取其中的数据分别是: 获取字节输入流如果前端发送的是字节数据比如传递的是文件数据则使用该方法 ServletInputStream getInputStream() 该方法可以获取字节获取字符输入流如果前端发送的是纯文本数据则使用该方法 BufferedReader getReader()接下来大家需要思考要想获取到请求体的内容该如何实现? 具体实现的步骤如下: 1.准备一个页面在页面中添加form表单,用来发送post请求 2.在Servlet的doPost方法中获取请求体数据 3.在doPost方法中使用request的getReader()或者getInputStream()来获取 4.访问测试 在项目的webapp目录下添加一个html页面名称为req.html !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head body !-- action:form表单提交的请求地址method:请求方式指定为post -- form action/request-demo/req1 methodpostinput typetext nameusernameinput typepassword namepasswordinput typesubmit /form /body /html在Servlet的doPost方法中获取数据 /*** request 获取请求数据*/ WebServlet(/req1) public class RequestDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//在此处获取请求体中的数据} }调用getReader()或者getInputStream()方法因为目前前端传递的是纯文本数据所以我们采用getReader()方法来获取 /*** request 获取请求数据*/ WebServlet(/req1) public class RequestDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取post 请求体请求参数//1. 获取字符输入流BufferedReader br req.getReader();//2. 读取数据String line br.readLine();System.out.println(line);} }注意 BufferedReader流是通过request对象来获取的当请求完成后request对象就会被销毁request对象被销毁后BufferedReader流就会自动关闭所以此处就不需要手动关闭流了。 启动服务器通过浏览器访问http://localhost:8080/request-demo/req.html 点击提交按钮后就可以在控制台看到前端所发送的请求数据 小结 HTTP请求数据中包含了请求行、请求头和请求体针对这三部分内容Request对象都提供了对应的API方法来获取对应的值: 请求行 getMethod()获取请求方式getContextPath()获取项目访问路径getRequestURL()获取请求URLgetRequestURI()获取请求URIgetQueryString()获取GET请求方式的请求参数 请求头 getHeader(String name)根据请求头名称获取其对应的值 请求体 注意: 浏览器发送的POST请求才有请求体如果是纯文本数据:getReader()如果是字节数据如文件数据:getInputStream() 2.2.4 获取请求参数的通用方式 在学习下面内容之前我们先提出两个问题: 什么是请求参数?请求参数和请求数据的关系是什么? 1.什么是请求参数? 为了能更好的回答上述两个问题我们拿用户登录的例子来说明 1.1 想要登录网址需要进入登录页面 1.2 在登录页面输入用户名和密码 1.3 将用户名和密码提交到后台 1.4 后台校验用户名和密码是否正确 1.5 如果正确则正常登录如果不正确则提示用户名或密码错误 上述例子中用户名和密码其实就是我们所说的请求参数。 2.什么是请求数据? 请求数据则是包含请求行、请求头和请求体的所有数据 3.请求参数和请求数据的关系是什么? 3.1 请求参数是请求数据中的部分内容 3.2 如果是GET请求请求参数在请求行中 3.3 如果是POST请求请求参数一般在请求体中 对于请求参数的获取,常用的有以下两种: GET方式: String getQueryString()POST方式: BufferedReader getReader();有了上述的知识储备我们来实现一个案例需求: 1发送一个GET请求并携带用户名后台接收后打印到控制台 2发送一个POST请求并携带用户名后台接收后打印到控制台 此处大家需要注意的是GET请求和POST请求接收参数的方式不一样具体实现的代码如下: WebServlet(/req1) public class RequestDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String result req.getQueryString();System.out.println(result);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {BufferedReader br req.getReader();String result br.readLine();System.out.println(result);} }对于上述的代码会存在什么问题呢? 如何解决上述重复代码的问题呢? 当然也可以在doGet中调用doPost,在doPost中完成参数的获取和打印,另外需要注意的是doGet和doPost方法都必须存在不能删除任意一个。 GET请求和POST请求获取请求参数的方式不一样在获取请求参数这块该如何实现呢? 要想实现我们就需要思考: GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样是否可以提供一种统一获取请求参数的方式从而统一doGet和doPost方法内的代码? 解决方案一: WebServlet(/req1) public class RequestDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求方式String method req.getMethod();//获取请求参数String params ;if(GET.equals(method)){params req.getQueryString();}else if(POST.equals(method)){BufferedReader reader req.getReader();params reader.readLine();}//将请求参数进行打印控制台System.out.println(params);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);} }使用request的getMethod()来获取请求方式根据请求方式的不同分别获取请求参数值这样就可以解决上述问题但是以后每个Servlet都需要这样写代码实现起来比较麻烦这种方案我们不采用 解决方案二: request对象已经将上述获取请求参数的方法进行了封装并且request提供的方法实现的功能更强大以后只需要调用request提供的方法即可在request的方法中都实现了哪些操作? (1)根据不同的请求方式获取请求参数获取的内容如下: (2)把获取到的内容进行分割内容如下: (3)把分割后端数据存入到一个Map集合中: 注意:因为参数的值可能是一个也可能有多个所以Map的值的类型为String数组。 基于上述理论request对象为我们提供了如下方法: 获取所有参数Map集合 MapString,String[] getParameterMap()根据名称获取参数值数组 String[] getParameterValues(String name)根据名称获取参数值(单个值) String getParameter(String name)接下来我们通过案例来把上述的三个方法进行实例演示: 1.修改req.html页面添加爱好选项爱好可以同时选多个 !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head body form action/request-demo/req2 methodgetinput typetext nameusernamebrinput typepassword namepasswordbrinput typecheckbox namehobby value1 游泳input typecheckbox namehobby value2 爬山 brinput typesubmit/form /body /html2.在Servlet代码中获取页面传递GET请求的参数值 2.1获取GET方式的所有请求参数 /*** request 通用方式获取请求参数*/ WebServlet(/req2) public class RequestDemo2 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//GET请求逻辑System.out.println(get....);//1. 获取所有参数的Map集合MapString, String[] map req.getParameterMap();for (String key : map.keySet()) {// username:zhangsan lisiSystem.out.print(key:);//获取值String[] values map.get(key);for (String value : values) {System.out.print(value );}System.out.println();}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} }获取的结果为: 2.2获取GET请求参数中的爱好结果是数组值 /*** request 通用方式获取请求参数*/ WebServlet(/req2) public class RequestDemo2 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//GET请求逻辑//...System.out.println(------------);String[] hobbies req.getParameterValues(hobby);for (String hobby : hobbies) {System.out.println(hobby);}}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} }获取的结果为: 2.3获取GET请求参数中的用户名和密码结果是单个值 /*** request 通用方式获取请求参数*/ WebServlet(/req2) public class RequestDemo2 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//GET请求逻辑//...String username req.getParameter(username);String password req.getParameter(password);System.out.println(username);System.out.println(password);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {} }获取的结果为: 3.在Servlet代码中获取页面传递POST请求的参数值 3.1将req.html页面form表单的提交方式改成post 3.2将doGet方法中的内容复制到doPost方法中即可 小结 req.getParameter()方法使用的频率会比较高 以后我们再写代码的时候就只需要按照如下格式来编写: public class RequestDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//采用request提供的获取请求参数的通用方式来获取请求参数//编写其他的业务代码...}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doGet(req,resp);} }2.3 IDEA快速创建Servlet 使用通用方式获取请求参数后屏蔽了GET和POST的请求方式代码的不同则代码可以定义如下格式: 由于格式固定所以我们可以使用IDEA提供的模板来制作一个Servlet的模板这样我们后期在创建Servlet的时候就会更高效具体如何实现: (1)按照自己的需求修改Servlet创建的模板内容 2使用servlet模板创建Servlet类 2.4 请求参数中文乱码问题 问题展示: (1)将req.html页面的请求方式修改为get !DOCTYPE html html langen headmeta charsetUTF-8titleTitle/title /head body form action/request-demo/req2 methodgetinput typetext nameusernamebrinput typepassword namepasswordbrinput typecheckbox namehobby value1 游泳input typecheckbox namehobby value2 爬山 brinput typesubmit/form /body /html(2)在Servlet方法中获取参数并打印 /*** 中文乱码问题解决方案*/ WebServlet(/req4) public class RequestDemo4 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 获取usernameString username request.getParameter(username);System.out.println(username);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }3启动服务器页面上输入中文参数 4查看控制台打印内容 5把req.html页面的请求方式改成post,再次发送请求和中文参数 6查看控制台打印内容依然为乱码 通过上面的案例会发现不管是GET还是POST请求在发送的请求参数中如果有中文在后台接收的时候都会出现中文乱码的问题。具体该如何解决呢 2.4.1 POST请求解决方案 分析出现中文乱码的原因 POST的请求参数是通过request的getReader()来获取流中的数据TOMCAT在获取流的时候采用的编码是ISO-8859-1ISO-8859-1编码是不支持中文的所以会出现乱码 解决方案 页面设置的编码格式为UTF-8把TOMCAT在获取流数据之前的编码设置为UTF-8通过request.setCharacterEncoding(“UTF-8”)设置编码,UTF-8也可以写成小写 修改后的代码为: /*** 中文乱码问题解决方案*/ WebServlet(/req4) public class RequestDemo4 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 解决乱码: POST getReader()//设置字符输入流的编码设置的字符集要和页面保持一致request.setCharacterEncoding(UTF-8);//2. 获取usernameString username request.getParameter(username);System.out.println(username);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }重新发送POST请求就会在控制台看到正常展示的中文结果。 至此POST请求中文乱码的问题就已经解决但是这种方案不适用于GET请求这个原因是什么呢咱们下面再分析。 2.4.2 GET请求解决方案 刚才提到一个问题是POST请求的中文乱码解决方案为什么不适用GET请求 GET请求获取请求参数的方式是request.getQueryString()POST请求获取请求参数的方式是request.getReader()request.setCharacterEncoding(“utf-8”)是设置request处理流的编码getQueryString方法并没有通过流的方式获取数据 所以GET请求不能用设置编码的方式来解决中文乱码问题那问题又来了如何解决GET请求的中文乱码呢? 首先我们需要先分析下GET请求出现乱码的原因: (1)浏览器通过HTTP协议发送请求和数据给后台服务器Tomcat) (2)浏览器在发送HTTP的过程中会对中文数据进行URL编码 (3)在进行URL编码的时候会采用页面meta标签指定的UTF-8的方式进行编码张三编码后的结果为%E5%BC%A0%E4%B8%89 (4)后台服务器(Tomcat)接收到%E5%BC%A0%E4%B8%89后会默认按照ISO-8859-1进行URL解码 (5)由于前后编码与解码采用的格式不一样就会导致后台获取到的数据为乱码。 思考: 如果把req.html页面的meta标签的charset属性改成ISO-8859-1,后台不做操作能解决中文乱码问题么? 答案是否定的因为ISO-8859-1本身是不支持中文展示的所以改了标签的charset属性后会导致页面上的中文内容都无法正常展示。 分析完上面的问题后我们会发现其中有两个我们不熟悉的内容就是URL编码和URL解码什么是URL编码什么又是URL解码呢? URL编码 这块知识我们只需要了解下即可,具体编码过程分两步分别是: (1)将字符串按照编码方式转为二进制 (2)每个字节转为2个16进制数并在前边加上% 张三按照UTF-8的方式转换成二进制的结果为: 1110 0101 1011 1100 1010 0000 1110 0100 1011 1000 1000 1001这个结果是如何计算的? 使用http://www.mytju.com/classcode/tools/encode_utf8.asp输入张三 就可以获取张和三分别对应的10进制然后在使用计算器选择程序员模式计算出对应的二进制数据结果: 在计算的十六进制结果中每两位前面加一个%,就可以获取到%E5%BC%A0%E4%B8%89。 当然你从上面所提供的网站中就已经能看到编码16进制的结果了: 但是对于上面的计算过程如果没有工具纯手工计算的话相对来说还是比较复杂的我们也不需要进行手动计算在Java中已经为我们提供了编码和解码的API工具类可以让我们更快速的进行编码和解码: 编码: java.net.URLEncoder.encode(需要被编码的内容,字符集(UTF-8))解码: java.net.URLDecoder.decode(需要被解码的内容,字符集(UTF-8))接下来咱们对张三来进行编码和解码 public class URLDemo {public static void main(String[] args) throws UnsupportedEncodingException {String username 张三;//1. URL编码String encode URLEncoder.encode(username, utf-8);System.out.println(encode); //打印:%E5%BC%A0%E4%B8%89//2. URL解码//String decode URLDecoder.decode(encode, utf-8);//打印:张三String decode URLDecoder.decode(encode, ISO-8859-1);//打印:å¼ ä¸ System.out.println(decode);} } 到这我们就可以分析出GET请求中文参数出现乱码的原因了 浏览器把中文参数按照UTF-8进行URL编码Tomcat对获取到的内容进行了ISO-8859-1的URL解码在控制台就会出现类上å¼ ä¸‰的乱码最后一位是个空格 清楚了出现乱码的原因接下来我们就需要想办法进行解决 从上图可以看住 在进行编码和解码的时候不管使用的是哪个字符集他们对应的%E5%BC%A0%E4%B8%89是一致的 那他们对应的二进制值也是一样的为: 1110 0101 1011 1100 1010 0000 1110 0100 1011 1000 1000 1001为所以我们可以考虑把å¼ ä¸‰转换成字节在把字节转换成张三在转换的过程中是它们的编码一致就可以解决中文乱码问题。 具体的实现步骤为: 1.按照ISO-8859-1编码获取乱码å¼ ä¸‰对应的字节数组 2.按照UTF-8编码获取字节数组对应的字符串 实现代码如下: public class URLDemo {public static void main(String[] args) throws UnsupportedEncodingException {String username 张三;//1. URL编码String encode URLEncoder.encode(username, utf-8);System.out.println(encode);//2. URL解码String decode URLDecoder.decode(encode, ISO-8859-1);System.out.println(decode); //此处打印的是对应的乱码数据//3. 转换为字节数据,编码byte[] bytes decode.getBytes(ISO-8859-1);for (byte b : bytes) {System.out.print(b );}//此处打印的是:-27 -68 -96 -28 -72 -119//4. 将字节数组转为字符串解码String s new String(bytes, utf-8);System.out.println(s); //此处打印的是张三} }说明:在第18行中打印的数据是-27 -68 -96 -28 -72 -119和张三转换成的二进制数据1110 0101 1011 1100 1010 0000 1110 0100 1011 1000 1000 1001为什么不一样呢 其实打印出来的是十进制数据我们只需要使用计算机换算下就能得到他们的对应关系如下图: 至此对于GET请求中文乱码的解决方案我们就已经分析完了最后在代码中去实现下: /*** 中文乱码问题解决方案*/ WebServlet(/req4) public class RequestDemo4 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 解决乱码POSTgetReader()//request.setCharacterEncoding(UTF-8);//设置字符输入流的编码//2. 获取usernameString username request.getParameter(username);System.out.println(解决乱码前username);//3. GET,获取参数的方式getQueryString// 乱码原因tomcat进行URL解码默认的字符集ISO-8859-1/* //3.1 先对乱码数据进行编码转为字节数组byte[] bytes username.getBytes(StandardCharsets.ISO_8859_1);//3.2 字节数组解码username new String(bytes, StandardCharsets.UTF_8);*/username new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8);System.out.println(解决乱码后username);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }注意 把request.setCharacterEncoding(UTF-8)代码注释掉后会发现GET请求参数乱码解决方案同时也可也把POST请求参数乱码的问题也解决了只不过对于POST请求参数一般都会比较多采用这种方式解决乱码起来比较麻烦所以对于POST请求还是建议使用设置编码的方式进行。 另外需要说明一点的是Tomcat8.0之后已将GET请求乱码问题解决设置默认的解码方式为UTF-8 小结 中文乱码解决方案 POST请求和GET请求的参数中如果有中文后台接收数据就会出现中文乱码问题 GET请求在Tomcat8.0以后的版本就不会出现了 POST请求解决方案是:设置输入流的编码 request.setCharacterEncoding(UTF-8); 注意:设置的字符集要和页面保持一致通用方式GET/POST需要先解码再编码 new String(username.getBytes(ISO-8859-1),UTF-8);URL编码实现方式: 编码: URLEncoder.encode(str,UTF-8);解码: URLDecoder.decode(s,ISO-8859-1);2.5 Request请求转发 请求转发(forward):一种在服务器内部的资源跳转方式。 (1)浏览器发送请求给服务器服务器中对应的资源A接收到请求 (2)资源A处理完请求后将请求发给资源B (3)资源B处理完后将结果响应给浏览器 (4)请求从资源A到资源B的过程就叫请求转发 请求转发的实现方式: req.getRequestDispatcher(资源B路径).forward(req,resp);具体如何来使用我们先来看下需求: 针对上述需求具体的实现步骤为: 1.创建一个RequestDemo5类接收/req5的请求在doGet方法中打印demo5 2.创建一个RequestDemo6类接收/req6的请求在doGet方法中打印demo6 3.在RequestDemo5的方法中使用 ​ req.getRequestDispatcher(“/req6”).forward(req,resp)进行请求转发 4.启动测试 (1)创建RequestDemo5类 /*** 请求转发*/ WebServlet(/req5) public class RequestDemo5 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(demo5...);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(2)创建RequestDemo6类 /*** 请求转发*/ WebServlet(/req6) public class RequestDemo6 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(demo6...);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(3)在RequestDemo5的doGet方法中进行请求转发 /*** 请求转发*/ WebServlet(/req5) public class RequestDemo5 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(demo5...);//请求转发request.getRequestDispatcher(/req6).forward(request,response);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(4)启动测试 访问http://localhost:8080/request-demo/req5,就可以在控制台看到如下内容: 说明请求已经转发到了/req6 请求转发资源间共享数据:使用Request对象 此处主要解决的问题是把请求从/req5转发到/req6的时候如何传递数据给/req6。 需要使用request对象提供的三个方法: 存储数据到request域[范围,数据是存储在request对象]中 void setAttribute(String name,Object o);根据key获取值 Object getAttribute(String name);根据key删除该键值对 void removeAttribute(String name);接着上个需求来: 1.在RequestDemo5的doGet方法中转发请求之前将数据存入request域对象中 2.在RequestDemo6的doGet方法从request域对象中获取数据并将数据打印到控制台 3.启动访问测试 (1)修改RequestDemo5中的方法 WebServlet(/req5) public class RequestDemo5 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(demo5...);//存储数据request.setAttribute(msg,hello);//请求转发request.getRequestDispatcher(/req6).forward(request,response);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(2)修改RequestDemo6中的方法 /*** 请求转发*/ WebServlet(/req6) public class RequestDemo6 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(demo6...);//获取数据Object msg request.getAttribute(msg);System.out.println(msg);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(3)启动测试 访问http://localhost:8080/request-demo/req5,就可以在控制台看到如下内容: 此时就可以实现在转发多个资源之间共享数据。 请求转发的特点 浏览器地址栏路径不发生变化 虽然后台从/req5转发到/req6,但是浏览器的地址一直是/req5,未发生变化 只能转发到当前服务器的内部资源 不能从一个服务器通过转发访问另一台服务器 一次请求可以在转发资源间使用request共享数据 虽然后台从/req5转发到/req6但是这个只有一次请求 3Response对象 前面讲解完Request对象接下来我们回到刚开始的那张图: Request:使用request对象来获取请求数据Response:使用response对象来设置响应数据 Reponse的继承体系和Request的继承体系也非常相似: 介绍完Response的相关体系结构后接下来对于Response我们需要学习如下内容: Response设置响应数据的功能介绍Response完成重定向Response响应字符数据Response响应字节数据 3.1 Response设置响应数据功能介绍 HTTP响应数据总共分为三部分内容分别是响应行、响应头、响应体对于这三部分内容的数据respone对象都提供了哪些方法来进行设置? 响应行 对于响应头比较常用的就是设置响应状态码: void setStatus(int sc);响应头 设置响应头键值对 void setHeader(String name,String value);响应体 对于响应体是通过字符、字节输出流的方式往浏览器写 获取字符输出流: PrintWriter getWriter();获取字节输出流 ServletOutputStream getOutputStream();介绍完这些方法后后面我们会通过案例把这些方法都用一用首先先来完成下重定向的功能开发。 3.2 Respones请求重定向 Response重定向(redirect):一种资源跳转方式。 (1)浏览器发送请求给服务器服务器中对应的资源A接收到请求 (2)资源A现在无法处理该请求就会给浏览器响应一个302的状态码location的一个访问资源B的路径 (3)浏览器接收到响应状态码为302就会重新发送请求到location对应的访问地址去访问资源B (4)资源B接收到请求后进行处理并最终给浏览器响应结果这整个过程就叫重定向 重定向的实现方式: resp.setStatus(302); resp.setHeader(location,资源B的访问路径);具体如何来使用我们先来看下需求: 针对上述需求具体的实现步骤为: 1.创建一个ResponseDemo1类接收/resp1的请求在doGet方法中打印resp1.... 2.创建一个ResponseDemo2类接收/resp2的请求在doGet方法中打印resp2.... 3.在ResponseDemo1的方法中使用 ​ response.setStatus(302); ​ response.setHeader(“Location”,“/request-demo/resp2”) 来给前端响应结果数据 4.启动测试 (1)创建ResponseDemo1类 WebServlet(/resp1) public class ResponseDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(resp1....);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(2)创建ResponseDemo2类 WebServlet(/resp2) public class ResponseDemo2 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(resp2....);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(3)在ResponseDemo1的doGet方法中给前端响应数据 WebServlet(/resp1) public class ResponseDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(resp1....);//重定向//1.设置响应状态码 302response.setStatus(302);//2. 设置响应头 Locationresponse.setHeader(Location,/request-demo/resp2);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }(4)启动测试 访问http://localhost:8080/request-demo/resp1,就可以在控制台看到如下内容: 说明/resp1和/resp2都被访问到了。到这重定向就已经完成了。 虽然功能已经实现但是从设置重定向的两行代码来看会发现除了重定向的地址不一样其他的内容都是一模一样所以request对象给我们提供了简化的编写方式为: resposne.sendRedirect(/request-demo/resp2)所以第3步中的代码就可以简化为 WebServlet(/resp1) public class ResponseDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(resp1....);//重定向resposne.sendRedirect(/request-demo/resp2)}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }重定向的特点 浏览器地址栏路径发送变化 当进行重定向访问的时候由于是由浏览器发送的两次请求所以地址会发生变化 可以重定向到任何位置的资源(服务内容、外部均可) 因为第一次响应结果中包含了浏览器下次要跳转的路径所以这个路径是可以任意位置资源。 两次请求不能在多个资源使用request共享数据 因为浏览器发送了两次请求是两个不同的request对象就无法通过request对象进行共享数据 介绍完请求重定向和请求转发以后接下来需要把这两个放在一块对比下: 以后到底用哪个还是需要根据具体的业务来决定。 3.3 路径问题 问题1转发的时候路径上没有加/request-demo而重定向加了那么到底什么时候需要加什么时候不需要加呢? 其实判断的依据很简单只需要记住下面的规则即可: 浏览器使用:需要加虚拟目录(项目访问路径)服务端使用:不需要加虚拟目录 对于转发来说因为是在服务端进行的所以不需要加虚拟目录 对于重定向来说路径最终是由浏览器来发送请求就需要添加虚拟目录。 掌握了这个规则接下来就通过一些练习来强化下知识的学习: a href路劲form action路径req.getRequestDispatcher(“路径”)resp.sendRedirect(“路径”) 答案: 1.超链接从浏览器发送需要加 2.表单从浏览器发送需要加 3.转发是从服务器内部跳转不需要加 4.重定向是由浏览器进行跳转需要加。问题2在重定向的代码中/request-demo是固定编码的如果后期通过Tomcat插件配置了项目的访问路径那么所有需要重定向的地方都需要重新修改该如何优化? 答案也比较简单我们可以在代码中动态去获取项目访问的虚拟目录具体如何获取我们可以借助前面咱们所学习的request对象中的getContextPath()方法修改后的代码如下: WebServlet(/resp1) public class ResponseDemo1 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(resp1....);//简化方式完成重定向//动态获取虚拟目录String contextPath request.getContextPath();response.sendRedirect(contextPath/resp2);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }重新启动访问测试功能依然能够实现此时就可以动态获取项目访问的虚拟路径从而降低代码的耦合度。 3.4 Response响应字符数据 要想将字符数据写回到浏览器我们需要两个步骤: 通过Response对象获取字符输出流 PrintWriter writer resp.getWriter(); 通过字符输出流写数据: writer.write(“aaa”); 接下来我们实现通过些案例把响应字符数据给实际应用下: 返回一个简单的字符串aaa /*** 响应字符数据设置字符数据的响应体*/ WebServlet(/resp3) public class ResponseDemo3 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType(text/html;charsetutf-8);//1. 获取字符输出流PrintWriter writer response.getWriter();writer.write(aaa);}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }返回一串html字符串并且能被浏览器解析 PrintWriter writer response.getWriter(); //content-type告诉浏览器返回的数据类型是HTML类型数据这样浏览器才会解析HTML标签 response.setHeader(content-type,text/html); writer.write(h1aaa/h1);注意:一次请求响应结束后response对象就会被销毁掉所以不要手动关闭流。 返回一个中文的字符串你好需要注意设置响应数据的编码为utf-8 //设置响应的数据格式及数据的编码 response.setContentType(text/html;charsetutf-8); writer.write(你好);3.3 Response响应字节数据 要想将字节数据写回到浏览器我们需要两个步骤: 通过Response对象获取字节输出流ServletOutputStream outputStream resp.getOutputStream(); 通过字节输出流写数据: outputStream.write(字节数据); 接下来我们实现通过些案例把响应字符数据给实际应用下: 返回一个图片文件到浏览器 /*** 响应字节数据设置字节数据的响应体*/ WebServlet(/resp4) public class ResponseDemo4 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 读取文件FileInputStream fis new FileInputStream(d://a.jpg);//2. 获取response字节输出流ServletOutputStream os response.getOutputStream();//3. 完成流的copybyte[] buff new byte[1024];int len 0;while ((len fis.read(buff))! -1){os.write(buff,0,len);}fis.close();}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }上述代码中对于流的copy的代码还是比较复杂的所以我们可以使用别人提供好的方法来简化代码的开发具体的步骤是: (1)pom.xml添加依赖 dependencygroupIdcommons-io/groupIdartifactIdcommons-io/artifactIdversion2.6/version /dependency(2)调用工具类方法 //fis:输入流 //os:输出流 IOUtils.copy(fis,os);优化后的代码: /*** 响应字节数据设置字节数据的响应体*/ WebServlet(/resp4) public class ResponseDemo4 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 读取文件FileInputStream fis new FileInputStream(d://a.jpg);//2. 获取response字节输出流ServletOutputStream os response.getOutputStream();//3. 完成流的copyIOUtils.copy(fis,os);fis.close();}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }4用户注册登录案例 接下来我们通过两个比较常见的案例一个是注册一个是登录来对今天学习的内容进行一个实战演练首先来实现用户登录。 4.1 用户登录 4.1.1 需求分析 用户在登录页面输入用户名和密码提交请求给LoginServlet在LoginServlet中接收请求和数据[用户名和密码]在LoginServlt中通过Mybatis实现调用UserMapper来根据用户名和密码查询数据库表将查询的结果封装到User对象中进行返回在LoginServlet中判断返回的User对象是否为null如果为nul说明根据用户名和密码没有查询到用户则登录失败返回登录失败数据给前端如果不为null,则说明用户存在并且密码正确则登录成功返回登录成功数据给前端 4.1.2 环境准备 复制资料中的静态页面到项目的webapp目录下 参考资料\1. 登陆注册案例\1. 静态页面,拷贝完效果如下: 创建db1数据库创建tb_user表创建User实体类 2.1 将资料\1. 登陆注册案例\2. MyBatis环境\tb_user.sql中的sql语句执行下: 2.2 将资料\1. 登陆注册案例\2. MyBatis环境\User.java拷贝到com.itheima.pojo 在项目的pom.xml导入Mybatis和Mysql驱动坐标 dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.5/version /dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.34/version /dependency创建mybatis-config.xml核心配置文件UserMapper.xml映射文件,UserMapper接口 4.1 将资料\1. 登陆注册案例\2. MyBatis环境\mybatis-config.xml拷贝到resources目录下 ?xml version1.0 encodingUTF-8 ? !DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd configuration!--起别名--typeAliasespackage namecom.itheima.pojo//typeAliasesenvironments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.jdbc.Driver/!--useSSL:关闭SSL安全连接 性能更高useServerPrepStmts:开启预编译功能amp; 等同于 ,xml配置文件中不能直接写 符号--property nameurl valuejdbc:mysql:///db1?useSSLfalseamp;useServerPrepStmtstrue/property nameusername valueroot/property namepassword value1234//dataSource/environment/environmentsmappers!--扫描mapper--package namecom.itheima.mapper//mappers /configuration4.2 在com.itheima.mapper包下创建UserMapper接口 public interface UserMapper {}4.3 将资料\1. 登陆注册案例\2. MyBatis环境\UserMapper.xml拷贝到resources目录下 注意在resources下创建UserMapper.xml的目录时要使用/分割 至此我们所需要的环境就都已经准备好了具体该如何实现? 4.1.3 代码实现 在UserMapper接口中提供一个根据用户名和密码查询用户对象的方法 /*** 根据用户名和密码查询用户对象* param username* param password* return*/Select(select * from tb_user where username #{username} and password #{password})User select(Param(username) String username,Param(password) String password);说明 Param注解的作用:用于传递参数,是方法的参数可以与SQL中的字段名相对应。 修改loign.html !DOCTYPE html html langenheadmeta charsetUTF-8titlelogin/titlelink hrefcss/login.css relstylesheet /headbody div idloginDivform action/request-demo/loginServlet methodpost idformh1 idloginMsgLOGIN IN/h1pUsername:input idusername nameusername typetext/ppPassword:input idpassword namepassword typepassword/pdiv idsubDivinput typesubmit classbutton valuelogin upinput typereset classbutton valueresetnbsp;nbsp;nbsp;a hrefregister.html没有账号点击注册/a/div/form /div/body /html编写LoginServlet WebServlet(/loginServlet) public class LoginServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收用户名和密码String username request.getParameter(username);String password request.getParameter(password);//2. 调用MyBatis完成查询//2.1 获取SqlSessionFactory对象String resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);//2.2 获取SqlSession对象SqlSession sqlSession sqlSessionFactory.openSession();//2.3 获取MapperUserMapper userMapper sqlSession.getMapper(UserMapper.class);//2.4 调用方法User user userMapper.select(username, password);//2.5 释放资源sqlSession.close();//获取字符输出流并设置content typeresponse.setContentType(text/html;charsetutf-8);PrintWriter writer response.getWriter();//3. 判断user释放为nullif(user ! null){// 登陆成功writer.write(登陆成功);}else {// 登陆失败writer.write(登陆失败);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }启动服务器测试 4.1 如果用户名和密码输入错误则 4.2 如果用户名和密码输入正确则 至此用户的登录功能就已经完成了~ 4.2 用户注册 4.2.1 需求分析 用户在注册页面输入用户名和密码提交请求给RegisterServlet在RegisterServlet中接收请求和数据[用户名和密码]在RegisterServlet中通过Mybatis实现调用UserMapper来根据用户名查询数据库表将查询的结果封装到User对象中进行返回在RegisterServlet中判断返回的User对象是否为null如果为nul说明根据用户名可用则调用UserMapper来实现添加用户如果不为null,则说明用户不可以返回用户名已存在数据给前端 4.2.2 代码编写 编写UserMapper提供根据用户名查询用户数据方法和添加用户方法 /** * 根据用户名查询用户对象 * param username * return */ Select(select * from tb_user where username #{username}) User selectByUsername(String username);/** * 添加用户 * param user */ Insert(insert into tb_user values(null,#{username},#{password})) void add(User user);修改register.html !DOCTYPE html html langen headmeta charsetUTF-8title欢迎注册/titlelink hrefcss/register.css relstylesheet /head bodydiv classform-divdiv classreg-contenth1欢迎注册/h1span已有帐号/span a hreflogin.html登录/a/divform idreg-form action/request-demo/registerServlet methodposttabletrtd用户名/tdtd classinputsinput nameusername typetext idusernamebrspan idusername_err classerr_msg styledisplay: none用户名不太受欢迎/span/td/trtrtd密码/tdtd classinputsinput namepassword typepassword idpasswordbrspan idpassword_err classerr_msg styledisplay: none密码格式有误/span/td/tr/tablediv classbuttonsinput value注 册 typesubmit idreg_btn/divbr classclear/form/div /body /html创建RegisterServlet类 WebServlet(/registerServlet) public class RegisterServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//1. 接收用户数据String username request.getParameter(username);String password request.getParameter(password);//封装用户对象User user new User();user.setUsername(username);user.setPassword(password);//2. 调用mapper 根据用户名查询用户对象//2.1 获取SqlSessionFactory对象String resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);//2.2 获取SqlSession对象SqlSession sqlSession sqlSessionFactory.openSession();//2.3 获取MapperUserMapper userMapper sqlSession.getMapper(UserMapper.class);//2.4 调用方法User u userMapper.selectByUsername(username);//3. 判断用户对象释放为nullif( u null){// 用户名不存在添加用户userMapper.add(user);// 提交事务sqlSession.commit();// 释放资源sqlSession.close();}else {// 用户名存在给出提示信息response.setContentType(text/html;charsetutf-8);response.getWriter().write(用户名已存在);}}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doGet(request, response);} }启动服务器进行测试 4.1 如果测试成功则在数据库中就能查看到新注册的数据 4.2 如果用户已经存在则在页面上展示 用户名已存在 的提示信息 4.3 SqlSessionFactory工具类抽取 上面两个功能已经实现但是在写Servlet的时候因为需要使用Mybatis来完成数据库的操作所以对于Mybatis的基础操作就出现了些重复代码如下 String resource mybatis-config.xml; InputStream inputStream Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);有了这些重复代码就会造成一些问题: 重复代码不利于后期的维护SqlSessionFactory工厂类进行重复创建 就相当于每次买手机都需要重新创建一个手机生产工厂来给你制造一个手机一样资源消耗非常大但性能却非常低。所以这么做是不允许的。 那如何来优化呢 代码重复可以抽取工具类对指定代码只需要执行一次可以使用静态代码块 有了这两个方向后代码具体该如何编写? public class SqlSessionFactoryUtils {private static SqlSessionFactory sqlSessionFactory;static {//静态代码块会随着类的加载而自动执行且只执行一次try {String resource mybatis-config.xml;InputStream inputStream Resources.getResourceAsStream(resource);sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSessionFactory getSqlSessionFactory(){return sqlSessionFactory;} }工具类抽取以后以后在对Mybatis的SqlSession进行操作的时候就可以直接使用 SqlSessionFactory sqlSessionFactory SqlSessionFactoryUtils.getSqlSessionFactory();这样就可以很好的解决上面所说的代码重复和重复创建工厂导致性能低的问题了。
http://www.w-s-a.com/news/130494/

相关文章:

  • 沈阳市浑南区城乡建设局网站wordpress 批量打印
  • 网站建设都需学哪些天津网站建设交易
  • 公司网站空间家装室内设计
  • 一个考试网站怎么做品牌建设10阶梯
  • 网站建设网站设计广东双语网站建设多少钱
  • 临时手机号注册网站建筑效果图
  • wordpress网站是什么类似wordpress博客
  • 国际网站空间昆明做网站开发维护的公司
  • 建网站选号域名网站优化大赛
  • 师范街网站建设广告制作公司口号
  • 电子商务网站开发设计报告为什么wordpress主题中字体不统一
  • 百度站长快速收录网站建设完工确认书
  • 企业网站备案代理商建设工程施工合同2013
  • 要学做网站wordpress xss漏洞
  • 白云品牌型网站建设在网上做国际快递淘宝网站
  • 无锡网站建设方式推广软件赚钱的app
  • 如何控制一个网站软件开发wordpress教育插件
  • 网站开发属于软件开发类吗wordpress邮件失败
  • 凡科网站怎么设计win8网站模板
  • 深圳整站seo个人网站建设一般流程
  • 济南网站中企动力wordpress主题ripro
  • 淮北网站建设求职简历怎么做点击图片进网站
  • 自适应网站推广注册公司流程和费用公司注册
  • 电子商务网站建设预算表网站建设卩金手指科杰
  • 广西响应式网站哪家好产品网络推广怎样做
  • 移动网可以上的网站是什么样子的淘宝优惠券网站开发
  • wordpress php设置伊宁seo网站建设
  • 兰陵住房建设局网站wordpress中文标题
  • 福州搜索优化网站个人网页网站制作模板
  • 网站开发分哪几个步骤使用wordpress开发一个页面跳转