html网页请求和servlet处理(eclipse使用的UTF8编码)都是utf8,为什么在servlet代码里面还要转换编码才不会乱码?

MikeDDT009 2017-07-04 09:41:47
总共算下来两个问题,新补充一个:
1.RT,开发环境使用的是eclipse,并且eclipse的工作区域编码设置的是UTF-8,在html代码一端的头部设置为了UTF-8编码,里面有个表单,然后请求处理servlet,为什么servlet的代码接收参数先要处理编码,甚至乱码,这是什么情况,毕竟都是UTF-8的编码设置?
2.关于servelt的生命周期,在开启服务的时候,一个Servlet只被创建一次,也就是说一个Servlet在总共只有一个对象?这样有理解错么?自己为Servlet设置一个构造器来看,发现可以启动服务器就被构造了一次
...全文
356 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cai820105 2017-07-05
  • 打赏
  • 举报
回复
以此回答你的两个问题哈:1.RT,开发环境使用的是eclipse,并且eclipse的工作区域编码设置的是UTF-8,在html代码一端的头部设置为了UTF-8编码,里面有个表单,然后请求处理servlet,为什么servlet的代码接收参数先要处理编码,甚至乱码,这是什么情况,毕竟都是UTF-8的编码设置? 因为servlet的缓冲区编码是iso-8859-1的编码集,所以你用utf-8转一次是解决不了的,你得先用iso-8859-1的编码解码一次,再用utf-8编码,这样就可以解决servlet乱码的问题。 2.关于servelt的生命周期,在开启服务的时候,一个Servlet只被创建一次,也就是说一个Servlet在总共只有一个对象?这样有理解错么?自己为Servlet设置一个构造器来看,发现可以启动服务器就被构造了一次 servlet的生命周期,servletcontext这个对象是会在服务器开机的时候创建,关机的时候会销毁,servlet有三个方法,一个是init一个是service,是用来接收get post请求的,还有一个是destory(单词不知道写错没),销毁的。你可以把这三个方法,随便加上打印语句,你就知道启动顺序了。 还有域对象,session域对象,属于会话级别的,关闭浏览器就结束了。servletcontext是服务器的全局域对象。服务器关机了才会消失。还有request域对象,属于请求的域对象
MikeDDT009 2017-07-05
  • 打赏
  • 举报
回复
引用 4 楼 pany1209 的回复:
[quote=引用 3 楼 MikeDDT009 的回复:] [quote=引用 2 楼 pany1209 的回复:] 1.编码问题具体参考:http://blog.csdn.net/xiazdong/article/details/7217022/ 2.servlet一般是单实例,也就是说处理同一个业务的servlet在web容器中只存在一个实例,默认情况下,servlet是web客户端第一次访问该servlet时创建的,你说的发现可以启动服务器就被构造了一次,应该是在xml中配置了<load-on-startup>,表示web服务器在启动时就加载这个servlet,所以会构造器和init(ServletConfig config) 会执行一次,。。。在之后的响应请求阶段只会调用service(HttpServletRequest req, HttpServletResponse resp)
是的,就servlet创建一个实例是理解了,但是假如有100个请求同时请求这个servlet的话,不是100个线程谁抢到谁先用?[/quote] servlet采用单实例多线程处理请求,也就是说依赖于线程池工作,如果多个请求同时请求同一个servlet,那么从线程池取出多个线程来服务请求,service方法并发执行。。。[/quote] 原来如此,
引用 4 楼 pany1209 的回复:
[quote=引用 3 楼 MikeDDT009 的回复:] [quote=引用 2 楼 pany1209 的回复:] 1.编码问题具体参考:http://blog.csdn.net/xiazdong/article/details/7217022/ 2.servlet一般是单实例,也就是说处理同一个业务的servlet在web容器中只存在一个实例,默认情况下,servlet是web客户端第一次访问该servlet时创建的,你说的发现可以启动服务器就被构造了一次,应该是在xml中配置了<load-on-startup>,表示web服务器在启动时就加载这个servlet,所以会构造器和init(ServletConfig config) 会执行一次,。。。在之后的响应请求阶段只会调用service(HttpServletRequest req, HttpServletResponse resp)
是的,就servlet创建一个实例是理解了,但是假如有100个请求同时请求这个servlet的话,不是100个线程谁抢到谁先用?[/quote] servlet采用单实例多线程处理请求,也就是说依赖于线程池工作,如果多个请求同时请求同一个servlet,那么从线程池取出多个线程来服务请求,service方法并发执行。。。[/quote] 原来如此,不过看您给的编码解决问题还是有疑问,就编码解码来说,必然是配套的,一边编一边解。从那博客看到的感觉还是少了一些东西,比如html采用的utf-8编码(英文貌似那种编码都没啥问题,随便都能接收到正确的。在这里假如表单提交了一个中文"中",这里假设一下在UTF-8编码中代表的二进制是1001,毕竟传输的都是二进制。。。),当里面的表单点击提交的时候,那么http里面的值字符串的编码又是什么,是直接html先UTF8,然后在请求的HTTP信息里面又是GBK编码(那么这里不就会二次编码,这里假设对1001编码为1100了),然后发送,服务端接收后解码。 额,大概意思就是请求编码流程这样个意思,都是二进制(UTF-8(这里是HTML文档设置了使用此字符集)(10001)---->GBK(11000)------->BIG5(11010))那么接收端想获得正确的内容就要把前面得流程反着来一次,也就是(BIG5(11010)------>GBK(11000)----->UTF-8(10001))然后获得的二进制才能是正确的传输内容。就那个博客来看,并没有看到这种从html获得内容开始。最终感觉还是就只知道,貌似,大概,针对这种情况也是只能记个结论吧?
李德胜1995 2017-07-05
  • 打赏
  • 举报
回复
引用 3 楼 MikeDDT009 的回复:
[quote=引用 2 楼 pany1209 的回复:] 1.编码问题具体参考:http://blog.csdn.net/xiazdong/article/details/7217022/ 2.servlet一般是单实例,也就是说处理同一个业务的servlet在web容器中只存在一个实例,默认情况下,servlet是web客户端第一次访问该servlet时创建的,你说的发现可以启动服务器就被构造了一次,应该是在xml中配置了<load-on-startup>,表示web服务器在启动时就加载这个servlet,所以会构造器和init(ServletConfig config) 会执行一次,。。。在之后的响应请求阶段只会调用service(HttpServletRequest req, HttpServletResponse resp)
是的,就servlet创建一个实例是理解了,但是假如有100个请求同时请求这个servlet的话,不是100个线程谁抢到谁先用?[/quote] servlet采用单实例多线程处理请求,也就是说依赖于线程池工作,如果多个请求同时请求同一个servlet,那么从线程池取出多个线程来服务请求,service方法并发执行。。。
MikeDDT009 2017-07-05
  • 打赏
  • 举报
回复
引用 2 楼 pany1209 的回复:
1.编码问题具体参考:http://blog.csdn.net/xiazdong/article/details/7217022/ 2.servlet一般是单实例,也就是说处理同一个业务的servlet在web容器中只存在一个实例,默认情况下,servlet是web客户端第一次访问该servlet时创建的,你说的发现可以启动服务器就被构造了一次,应该是在xml中配置了<load-on-startup>,表示web服务器在启动时就加载这个servlet,所以会构造器和init(ServletConfig config) 会执行一次,。。。在之后的响应请求阶段只会调用service(HttpServletRequest req, HttpServletResponse resp)
是的,就servlet创建一个实例是理解了,但是假如有100个请求同时请求这个servlet的话,不是100个线程谁抢到谁先用?
李德胜1995 2017-07-05
  • 打赏
  • 举报
回复
1.编码问题具体参考:http://blog.csdn.net/xiazdong/article/details/7217022/ 2.servlet一般是单实例,也就是说处理同一个业务的servlet在web容器中只存在一个实例,默认情况下,servlet是web客户端第一次访问该servlet时创建的,你说的发现可以启动服务器就被构造了一次,应该是在xml中配置了<load-on-startup>,表示web服务器在启动时就加载这个servlet,所以会构造器和init(ServletConfig config) 会执行一次,。。。在之后的响应请求阶段只会调用service(HttpServletRequest req, HttpServletResponse resp)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧