web jsp第2天(中文乱码,get,post,查找错误,转发,重定向,页面跳转携带值,session会话)
中文乱码问题
注意:tomcat:8.5版本不会出现,form表单get请求在tomcat8.0之前需要手动设置字符集,否则会出现中文乱码问题
get请求中文乱码问题
1.方法一:使用String的构造方法,将字符集改成utf-8并赋值给自己
string name=request.getParameter("user");
name=new String(name.getBytes("iso-8859-1"),"utf-8");
2. 方法二:
在server.xml文件设置端口号的标签中添加URIEncoding="utf-8"
post请求中文乱码问题
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("UTF-8");
页面常见的两种错误
- 404
(1)页面的路径不正确
(2)tomcat服务没有启动 - 500:页面上的java代码有问题(NullPointerException)
- 编译错误
- 代码抛出异常
eclipse中jsp文件控制台报异常
1.需要去apache-tomcat-8.5.57\work\Catalina\localhost\web02\org\apache\jsp下面找到对应的java文件(因为执行后会把jsp文件编译成java文件)
转发和重定向
流程:表单提交到的页面不做内容显示,只做内容的校验以及页面的跳转
例如:douser.jsp这个页面只做用户名和密码的判断,如果判断满足要求,则跳转到另外的页面进行内容展示,如果永不不满足,则回到原来的user.jsp页面,并且提示用户为什么不满足(用户名或者密码不正确)
面试题:转发和重定向的区别
转发:
(1)地址栏不会发生改变(转发出去的页面地址不会显示)
(2)转发只会发送一次请求(所以在转发出去的页面依然可以从request中获取用户信息)
(3)转发的地址只能是当前项目的
重定向:
(1)地址栏会发生变化
(2)重定向会发生两次请求
(3)重定向的地址可以是任意的
区别有如下几点:
1、请求次数
重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
2、地址栏不同
重定向地址栏会发生变化,转发地址栏不会发生变化;
3、是否共享数据
重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
4、跳转限制
重定向可以跳转到任意URL,转发只能跳转本站点资源;
5、发生行为不同
重定向是客户端行为,转发是服务器端行为;
主要代码如下
user.jsp代码:
<form action="douser.jsp">
用户名:<input name="user"><br>
密码:<input name="pass"><br>
爱好:<input type="checkbox" name="hobby" value="swim">游泳<br>
<input type="checkbox" name="hobby" value="climb">爬山<br>
<input type="checkbox" name="hobby" value="sing">唱歌<br>
<input type="checkbox" name="hobby" value="basketball">篮球<br>
<input type="submit" value="提交">
</form>
douser.jsp代码:
<%
String name=request.getParameter("user");
String pass=request.getParameter("pass");
if("admin".equals(name)&&"123".equals(pass)){
//转发到index.jsp页面
//request.getRequestDispatcher("index.jsp").forward(request, response);
//重定向到index.jsp页面
//response.sendRedirect("index.jsp");
}else{
//否则回到user.jsp
request.getRequestDispatcher("user.jsp").forward(request, response);
}
%>
index.jsp代码如下:
<h1>
<%String name=request.getParameter("user"); %>
欢迎<%=name %></h1>
两种方式携带想要的值
(1)模仿get请求,在浏览器地址后面拼接?名称=值&名称=值...
如果内容携带的中文,则需要采用以下方式解决乱码问题
message=URLEncoder.encode(message, "UTF-8")😭)转码
mess=URLDecoder.decode(mess, "UTF-8");解码
(2)使用作用域携带参数
四大作用域
pageContext:仅限于当前页面
request:限于当次请求
session:限于当次会话
application:限于整个项目,相当于全局变量(所有用户共用)
使用方法:
设置属性值:作用域名.setAtteribute("属性名","属性值")
获取属性值:作用域名.getAtteribute("属性名")
代码在web02项目下的user.jsp和douser.jsp
session会话
- session是浏览器和服务器之间的一次通话,当我们打开浏览器成功访问页面的时候,该通话就已经建立,只要服务器不重启session会话,就会一直存在(此时服务器会给该用户生成一个唯一的sessionId,保存在服务端,当用户再次访问服务端的时候,如果检测到相同的sessionId,则直接获取用户信息)
- session的作用:通常是用来保存用户的基本信息的(登录信息),因此可以在一些指定的页面验证用户是否曾经登录过
- session会话可以有以下三种方式设置失效(在服务器不重启的情况下)
(1)让session以秒为单位失效
session.setMaxInactiveInterval(5);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?