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

做网站视频手机常州网站关键词推广

做网站视频手机,常州网站关键词推广,嘉兴市做网站优化,java与php哪个做网站好Request & Response 在之前的博客中,初最初见到Request和Response对象,是在Servlet的Service方法的参数中,之前隐性地介绍过Request的作用是获取请求数据。通过获取的数据来进行进一步的逻辑处理,然后通过对Response来进行数…

Request & Response

在之前的博客中,初最初见到Request和Response对象,是在Servlet的Service方法的参数中,之前隐性地介绍过Request的作用是获取请求数据。通过获取的数据来进行进一步的逻辑处理,然后通过对Response来进行数据响应。接下来一起学习下具体知识吧~

Request继承体系

请添加图片描述

Tomcat需要解析请求数据,封装为request对象,并且创建requestx对象传递到service方法中

Request获取请求数据

请求数据分为3部分:

  • 请求行:

    // GET/request-demo/req1?username=zhangsan HTTP/1.1
    String getMethod()		// 获取请求方式:GET
    String getContextPath():// 获取虚拟目录(项目访问路径 动态获取):/request-demo
    String Buffer getRequestURL(): // 获取URL(统一资源定位符):http://localhost:8080/request-demo/req1
    String getRequestURI():	// 获取URI(统一资源标识符):/request-demo/req1
    String getQueryString():// 获取请求参数(GET方式):username:=zhangsan&password-=123
    
  • 请求头:

    // User-Agent:Mozilla/5.0 Chrome/91.0.4472.106  浏览器版本信息
    String getHeader(String name) //:根据请求头名称,获取值
    
  • 请求体:

    // Post情况
    // username=superbaby&password=123
    ServletInputStream getlnputStream()	// :获取字节输入流
    BufferedReader getReader()			// :获取字符输入流
    
Request通用方式获取请求参数

GET请求方式和POST请求方式区别主要在于获取请求参数的方式不一样,是否可以提供一种统一获取请求参数的方式,从而统一doGt和doPost方法内的代码?

请添加图片描述

通过上面的图片可以发现,请求数据可以通过拆分,得到具体的键值对,因此:

// GET 获取请求方式
String getQueryString()
// POST 获取请求方式
BufferedReader getReader()
// 自己去实现的统一获取请求方式
String method = this.getMethod();
//判断
if ("GET".equals(method)){//GET方式获取请求参数params = this.getQueryString();
}else if ("POST".equals(method)){//P0ST方式获取请求参数BufferedReader reader = this.getReader();params = reader.readLine();
}
// JAVA EE自带的通用方式
// Map<String,String[]> getParameterMap():获取所有参数Map集合
// String[] getParameterValues(String name):根据名称获取参数值(数组)
// String getParameter(String name):根据名称获取参数值(单个值)
// 使用通用方式获取请求参数后,屏蔽了GET和POST的请求方式代码的不同,则代码可以定义为如下格式:
//此过程中不需要判断是POST 还是 GET,这一步上面的通用方法会自己解决
@WebServlet("/reqDemo3")
public class RequestDemo3 extends HttpServlet {@overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)
}
@override
protected void doPost(HttpServletRequest req,HttpServletResponse resp){this.doGet(req,resp);
}
// 通用方式在IDEA中可以使用Servlet模板创建Servlet更高效
// 步骤:选择【包】,【右键】选择【New】选择倒数第四个【Servlet】
请求参数中文乱码处理
// 之前介绍过由于POST是通过获取字符流的方式来获取参数的,因此如果POST遇到中文字符乱码的问题,则:
request.setCharacterEncoding("UTF-8");//设置字符输入流的编码
// 而GET方式,由于在参数传递的过程中,首先会通过URL编码,然后到服务器以后再通过URL解码,但解码过程中采用的ISO-8859-1,这个是Tomcat默认的格式,因此通过修改流的方式无法改变,因此要通过:
// 1. 将URL编码的数据转换成字节数据
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
// 2.将字节数组转为字符串
String s = new String(bytes,StandardCharsets.UTF_8);
// 该方式不仅可以解决GET的乱码问题,也可以解决POST的乱码问题
// 该问题再Tomcat 8.0以后,已将Get请求乱码问题解决,设置默认的编码方式为UTF-8

Request请求转发

一种在服务器内部的资源跳转方式。

请添加图片描述

  • 实现方式:

  • 请求转发资源间共享数据:使用Request对象

    • void setAttribute(String name,Object o):存储数据到request域中
    • Object getAttribute(String name):根据key,获取值
    • void removeAttribute(String name):根据key,删除该键值对
    //转发之前可以通过上面的方法添加数据
    req.setAttribute("msg","name")
    req.getRequestDispatcher("资源B路径").forward(req,resp); //req:请求对象 resp:响应对象
    
  • 请求转发特点:

    • 浏览器地址栏路径不发生变化
    • 只能转发到当前服务器的内部资源
    • 一次请求,可以在转发的资源间使用request共享数据

Response继承体系

请添加图片描述

Response设置响应数据功能介绍
响应数据分为3部分
  • 响应行

    HTTP/1.1 200 OK
    void setStatus(int sc)  //:设置响应状态码
    
  • 响应头

    Content-Type:text/html
    void setHeader(String name,.String value)  //:设置响应头键值对
    
  • 响应体

    <html><head>head><body></body></html>
    PrintWriter getWriter()					//:获取字符输出流
    ServletOutputStream getOutputStream()	//:获取字节输出流
    
Response完成重定向

重定向(Redirect):一种资源跳转方式,访问流程如下:

请添加图片描述

resp.setStatus(302);                       //resp 响应对象
resp.setHeader("location”,“资源B的路径");	//resp 响应对象
//简化方式完成重定向
response.sendRedirect("资源B的路径");

重定向特点:

  • 浏览器地址栏路径发生变化
  • 可以重定向到任意位置的资源(服务器内部、外部均可)
  • 两次请求,不能在多个资源使用request共享数据
路径问题

在上面的资源转发和重定向 路径中,时常会遇到需要使用到虚拟路径或不适用虚拟路径的问题,那么什么时候使用,什么时候不使用呢?

这需要明确路径是谁在使用

  • 浏览器使用:需要加虚拟目录(项目访问路径)
  • 服务端使用:不需要加虚拟目录
Response响应字符数据
  • 使用:

    • 通过Response对象获取字符输出流

      PrintWriter writer = resp.getWriter(); //resp 响应对象
      
    • 写数据

      writer.write("aaa");
      // 细节:流不需要关闭
      // 设置流的编码,同时设置了响应头
      response.setcontentType("text/html;charset=utf-8");
      
Response响应字节数据
  • 使用:

    • 通过Response对象获取字节输出流(字节数据:图片、音频、视频等)

      ServletOutputStream outputStream = resp.getOutputStream();
      
    • 写数据

      outputStream.write(字节数据);
      
  • 举例,向客户端传送一张图片:

    • 导入工具commons-io

      <!--先引入一个commons-io 依赖-->
      <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
      </dependency>
      
    • 实现逻辑代码:

      //1.读取文件
      FileInputStream fis = new FileInputStream("d://a.jpg");
      //2.获取response字节输出流
      ServletoutputStream os = response.getOutputStream();
      IOUtils.copy(fis,os);
      fis.close();
      

案例:用户登录

  • 流程说明:
    • 用户填写用户名密码,提交到LoginServlet
    • 在LoginServlet中使用MyBatisi查询数据库,验证用户名密码是否正确
    • 如果正确,响应“登录成功”,如果错误,响应“登录失败”
//这里仅给出逻辑代码,对于MyBatis和Maven的配置,以及相关Mapper文件、pojo类、映射文件的接口等代码见前面的文章
//1.接收用户名和密码
String username = request.getParameter(name:"username");
String password = request.getParameter(name:"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获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User user = userMapper.select(username,password);
//2.5释放资源
sqlSession.close();
//获取字符输出流,并设置content type
response.setcontentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
//3.判断user是否为null
if(user != null){//登陆成功writer.write(s:"登陆成功");
}else{//登陆失败writer.write(S:"登陆失败");
}

用户注册

  • 流程说明
    • 用户填写用户名、密码等信息,点击注册按钮,提交到RegisterServlet
    • 在RegisterServlet中使用MyBatis保存数据
    • 保存前,需要判断用户名是否已经存在:根据用户名查询数据库
//相较于上面,这里需要对数据库进行两次操作,一次是查询,一次是添加,内容见前面博客
//1.接收用户数据
String username = request.getParameter(name:"username");
String password = request.getParameter(name:"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获取Mapper
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//2.4调用方法
User u = userMapper.selectByUsername(username);
//3.判断用户对象是否为null
if(u == null){// 用户名不存在,添加用户userMapper.add(user);// 提交事多sqlSession.commit();// 释放资源sqlSession.close();
}else{//用户名存在,给出提示信息response.setContentType("text/html;charset=utf-8");response.getWriter().write("用户名已存在");// 释放资源sqlSession.close();
}

案例代码优化

  • 问题:
    • 代码重复:建立工具类
    • 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;}
}
// 然后在上面2.1修改代码,调用静态方法,得到sqlSessionFactory对象即可
// 与sqlSessionFactory不同的是:sqlSession不能仅创建一次,因为多用户情况下,仅创建一次,对于用户体验来说 并不好

如果觉得文章对您有帮助,请帮忙点赞或者收藏,如果在文章中发现什么错误或不准确的地方,欢迎与我交流。


文章转载自:
http://dinncochieftain.tqpr.cn
http://dinncoremasticate.tqpr.cn
http://dinncooccasionalist.tqpr.cn
http://dinncogrowing.tqpr.cn
http://dinncocastroite.tqpr.cn
http://dinncokamikaze.tqpr.cn
http://dinncoaesthetics.tqpr.cn
http://dinncopongid.tqpr.cn
http://dinncoenchondrosis.tqpr.cn
http://dinncocureless.tqpr.cn
http://dinncoscantling.tqpr.cn
http://dinncocondenses.tqpr.cn
http://dinncofriseur.tqpr.cn
http://dinncopetrograph.tqpr.cn
http://dinncobifunctional.tqpr.cn
http://dinncoaauw.tqpr.cn
http://dinncounregenerate.tqpr.cn
http://dinncoinspirer.tqpr.cn
http://dinncogalbanum.tqpr.cn
http://dinncoscribe.tqpr.cn
http://dinncoleaf.tqpr.cn
http://dinncoreadset.tqpr.cn
http://dinncohypogastria.tqpr.cn
http://dinncophlegmatized.tqpr.cn
http://dinncoverisimilar.tqpr.cn
http://dinncovail.tqpr.cn
http://dinncobriskly.tqpr.cn
http://dinncogreenyard.tqpr.cn
http://dinncoanzus.tqpr.cn
http://dinncooffend.tqpr.cn
http://dinncohemopoiesis.tqpr.cn
http://dinncoendomyocarditis.tqpr.cn
http://dinncoherbivore.tqpr.cn
http://dinncoazinphosmethyl.tqpr.cn
http://dinncoairways.tqpr.cn
http://dinnconympha.tqpr.cn
http://dinncopedicel.tqpr.cn
http://dinncocorean.tqpr.cn
http://dinncosoupfin.tqpr.cn
http://dinncoamphimacer.tqpr.cn
http://dinncophenethicillin.tqpr.cn
http://dinncofitfully.tqpr.cn
http://dinncoiffy.tqpr.cn
http://dinncogravenstein.tqpr.cn
http://dinncoseparatism.tqpr.cn
http://dinncoungainliness.tqpr.cn
http://dinncocrochet.tqpr.cn
http://dinnconoway.tqpr.cn
http://dinncoinstructorship.tqpr.cn
http://dinncotactfully.tqpr.cn
http://dinncorectificatory.tqpr.cn
http://dinncozircaloy.tqpr.cn
http://dinncodognap.tqpr.cn
http://dinncocutin.tqpr.cn
http://dinncosuburbanity.tqpr.cn
http://dinncosaeter.tqpr.cn
http://dinncodisburse.tqpr.cn
http://dinncooverplease.tqpr.cn
http://dinncoroscian.tqpr.cn
http://dinncofederalization.tqpr.cn
http://dinncoobligation.tqpr.cn
http://dinncoappendage.tqpr.cn
http://dinncorunless.tqpr.cn
http://dinncodorian.tqpr.cn
http://dinnconile.tqpr.cn
http://dinncona.tqpr.cn
http://dinncoanemometric.tqpr.cn
http://dinncosirenian.tqpr.cn
http://dinncoparamyxovirus.tqpr.cn
http://dinncovolatilizable.tqpr.cn
http://dinncounadvantageous.tqpr.cn
http://dinncoanthelion.tqpr.cn
http://dinncobemean.tqpr.cn
http://dinncosomnambulist.tqpr.cn
http://dinncosurveillant.tqpr.cn
http://dinncopelorus.tqpr.cn
http://dinncoperidot.tqpr.cn
http://dinncosouthernly.tqpr.cn
http://dinncosailorly.tqpr.cn
http://dinncokollergang.tqpr.cn
http://dinncodehydrogenize.tqpr.cn
http://dinncoexumbrella.tqpr.cn
http://dinncoriverine.tqpr.cn
http://dinncobloodstone.tqpr.cn
http://dinncodominancy.tqpr.cn
http://dinncobutylene.tqpr.cn
http://dinncobifurcation.tqpr.cn
http://dinncofolkmote.tqpr.cn
http://dinncocariole.tqpr.cn
http://dinncobanana.tqpr.cn
http://dinncopurlin.tqpr.cn
http://dinncoenzymic.tqpr.cn
http://dinncocantatrice.tqpr.cn
http://dinncocounselor.tqpr.cn
http://dinncorune.tqpr.cn
http://dinncoazimuth.tqpr.cn
http://dinnconabe.tqpr.cn
http://dinncoquasiparticle.tqpr.cn
http://dinncochlorambucil.tqpr.cn
http://dinncopresuppose.tqpr.cn
http://www.dinnco.com/news/94099.html

相关文章:

  • 电影天堂网站用什么程序做的免费生成短链接
  • 真人做爰中国视频网站微博推广费用一般多少
  • 西安建设教育网站google网址直接打开
  • 做网站的软件图标seo技术建站
  • 网站建设的成功经验百度app下载最新版本
  • 使用jquery做网站网络营销公司注册找哪家
  • 网站备案号查不到电子商务网站推广
  • web网站开发工程师教育培训网站大全
  • 医院网站建设情况说明书企业网站分析报告
  • 网站制作与建设网站设计与建设的公司
  • 个人网站怎么样的家电企业网站推广方案
  • 如何不花钱做网站怎么开发网站
  • 网站logo如何做清晰深圳专业seo
  • 自己做网站不用WordPress企业网络营销方法
  • 如何拷贝别人网站的源码网页设计成品源代码
  • 设计网站私单价格合肥网站优化方案
  • 带数字 网站 域名新闻发稿平台有哪些?
  • 做平台网站外包多少钱啊武汉网站推广
  • 网站无备案无法登入湘潭seo公司
  • 大型网站建设推荐semi
  • 没有网站可以做seo网络整合营销推广
  • wordpress会员空间插件电商中seo是什么意思
  • 网站建设横幅企业网站设计要求
  • 新上线网站如何做搜索引擎中国站长网入口
  • 铜陵做网站的window优化大师
  • 政务门户网站建设思想网站推广文章
  • 温州营销网站制作费用六种常见的网站类型
  • 谷歌怎么做网站优化亚马逊提升关键词排名的方法
  • wordpress 邮箱配置南京seo招聘
  • 连云港市网站建设网站建设明细报价表