Servlet和JSP(问题总结一)
请求中文乱码
使用String进行数据重新编码
value = new String(value.getBytes("iso8859-1"),"UTF-8"); 该方法其value解码后的字通过iso-8859-1反解码成二进制数组,再将该字节数组用UTF-8解码,最终被new String成字符串。 缺点:需要一一对可能输入中文的地方进行操作,当有大量变量存在问题时,工作量比较大。
使用公共配置
get方式: 步骤1:resp.setContentType("text/html;charset=utf-8");//需要在使用变量之前 步骤2:在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中添加属性useBodyEncodingForURI="true" post方式: resp.setContentType("text/html;charset=utf-8");//需要在使用变量之前
PS:在验证第一种方式的时候Eage和Firefox浏览器上都无效,Chrome上能够成功,暂时还不知道原因,如果知道的话我第一时间补上,也希望小伙伴能够多多指教~
Servlet流程总结
1.服务器发起请求到服务器(请求) 2.服务器接收浏览器的请求进行解析,创建request对象储存请求数据 3.服务器调用对应的Servlet进行处理,并将request对象作为实参传递给servlet的方法 4.servlet的方法执行进行请求处理 //设置请求编码格式 //设置响应编码格式 //获取请求信息 //处理请求信息 //创建业务层对象 //调用业务层对象的方法 //响应处理结果
请求转发
目的:servlet职责明确,代码冗余少 作用:实现多个servlet联动操作处理请求 使用: req.getRequestDispatcher("要转发的地址").forward(req,resp)(地址是相对路径直接写servlet的别名即可) 特点:一次请求,浏览器地址栏信息不改变(服务器内可能经过几个servlet) 注意:请求转发后直接return
使用请求转发后不同的Servlet之间共享数据的方式(对于一个请求来说,不管经历多少个Servlet,其本质均为一个req,但是可以增加属性)
解决:使用request对象的作用域 使用: req.setAttribute(object name,object value); req.getAttribute(object obj) 作用:request对象解决了一次请求内的不同Servlet的数据共享问题 作用域:基于请求转发,一次请求中的所有Servlet共享 注意:使用Request对象进行数据流传,数据只在一次请求内有效。 request对象特点:服务器创建、每次请求都会创建、生命周期一次请求 问题:请求转发由于地址栏信息不改变,如果刷新会造成表单数据重复提交,可以使用重定向解决
重定向
解决了表单重复提交的问题,以及当前servlet无法处理的请求问题。 使用:resp.sendRedirect(URI/URL) 特点:两次请求、两个request对象(第一次请求的request内的内容第二个request不具备,需要解决不同请求对象之间的数据共享问题:使用session)、浏览器地址栏信息改变 时机:如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向 如果请求被servlet接收后,无法进行处理,建立使用重定向定位到可以处理的资源。