JSP内置对象
什么是JSP内置对象
JSP内置对象,就是在编写JSP页面时,不需做任何说明就可以直接使用的对象,在JSP中有九大内置对象。分别是:
1.HttpServletRequet类的Request对象:代表请求对象,主要用于接受客户端通过HTTP协议连接传输服务器端的数据。
2.HttpSevletResponse类的Response对象:代表响应对象,主要用于向客户端发送数据。
3.JspWriter类的out对象:主要用于向客户端输出数据,out的基类是jspWriter
4.HttpSession类的session对象:主要用来分别保存每个月的信息与请求关联的会话;会话状态的维持是web应用开发者必须面对的问题。
5.ServletContext类的application对象:主要用于保存用户信息,代码片段的运行环境;它是一个共享的内置对象,即一个容器中的多个用户共享一个application
,故其保存的信息被所有用户所共享。
6.PageContext类的PageContext对象:管理网页属性,为jsp页面包装页面的上下文,管理对属于jsp的特殊可见部分中已经命名对象的访问,它的创建和初始化都是由容器来完成的。
7.ServletConfig类的Config对象:代码片段配置对象,标识Servlet的配置。
8.Object类的Page对象,处理jsp页面,是object类的一个实例,指的是jsp实现类的实例
9.Exception对象:处理jsp文件执行时发生的错误和异常,只有在错误页面里才使用,前提是在页面指令里要有isErrorPage=true。
本文讲解前四种内置对象
JSP内置对象out
此对象用法非常简单,向浏览器输出数据。
<%
out.print("hello jsp");
%>
```
内置对象request
次对象用于向服务器发出请求。
request常用方法:
方法名称 | 说明 |
---|---|
String getParameter(String name) | 根据页面表单组件名称获取页面提交数据 |
String[] getParameterValues(String name) | 获取一组以相同名称命名的表单组件提交的数据 |
void setCharacterEncoding(String charset) | 指定每个请求的编码,在调用requset.getParameter()方法之前进行设定,可以用于解决中文乱码问题 |
RquestDispatcher getRequestDispatcher(String path) | 返回一个 javax.servlet.RequestDispatcher对象,该方法用于转发请求 |
示例:
JSP页面代码:
<form action="conteol.jsp" method="post">
姓名:<input name="name" type="text"><br/>
<input type="checkbox" name="channel" value="唱歌"/>唱歌
<input type="checkbox" name="channel" value="跳舞"/>跳舞
<input type="checkbox" name="channel" value="篮球"/>篮球
<input type="submit" value="提交"/>
</form>
运行效果:
处理页面代码:
String name=request.getParameter("name");
String a[]=request.getParameterValues("channel");
out.print("姓名:"+name);
if(a!=null){
out.print("兴趣:");
for (int i = 0; i < a.length; i++) {
String b=a[i];
out.print(b+" ");
}
}
如图有一个文本框和一个复选框,当页面提交到处理页面,就可以用request对象的getParameter()方法和getParameterValues()方法获取请求中提交的数据并输出。getParameter()由提供的参数名称获取指定的某一个数据。getParameterValues()方法由提供的参数名称获取一个字符串数组,该数组对应所有选中的复选框,如果没有选择任何选项,请求中不包含channel的参数,则该方法返回null。
这里要注意的是,获取的数据不经过任何处理是会产生中文乱码的,因为在Web应用中,通常都包括了浏览器、Web服务器、Web应用程序和数据库等部分,每一部分可能使用的都不是相同的字符集,从而导致字符数据在各种不同的字符集之间转换时,出现乱码问题。
解决中文乱码问题,根据产生的原因,注意有以下几种解决方案:
post提交方式解决中文乱码方法:
request对象的getParameter()方法得到的字符串是以ISO-8859-1 转换而来的,所以在获取数据之前,调用request对象的setCharacterEncoding(‘UTF-8’)方法,将请求的编码方式设定为UTF-8即可。
request.setCharacterEncoding("UTF-8");
get提交方式解决中文乱码方法:
第一种方法:
当采用get方式提交数据时,用getParameter()方法是不起作用的,这时需要得到请求数据后,进行编码转换。
String name=request.getParameter("name");
name=new String(name.getBytes("ISO-8859-1"),"UTF-8");
其中name.getBytes(“ISO-8859-1”)是按照“ISO-8859-1”字符集编码把name字符串转换成byte数组,再通过new String()方法,使用指定的“UTF-8”字符集把byte数组构造成一个新的String。
第二种方法:
第一种方法需要一个一个转换编码格式比较繁琐,效率也不高。这时可以通过在tomcat中设置字符集的方式解决,配置方式如下:找到Tomcat目录结构的conf\server.xml文件,在<Connector>
元素添加URIEncoding属性,将它的值设置为“UTF-8”。这一行也就是之前改端口的那一行。如下:
转发方式页面跳转
示例:
如果用户输入了姓名给他登录到欢迎页面。
if(name!=null){
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}
JSP内置对象response
request对象常用方法:
方法名称 | 说明 |
---|---|
void addCookie(Cookie cookie) | 向客户端添加Cookie |
void setContentType(String type) | 设置HTTP响应的contentType类型 |
void setCharacterEncoding(Stribf charset) | 设置响应所采用的字符编码类型 |
void sendRedirect(String location) | 将请求重新定位到一个新的URL上 |
这里详细讲一下重定向
示例:
接上面的示例接着讲吧,如果用户输入了姓名给他登录跳转到欢迎页面。
if(name!=null){
response.sendRedirect("welcome.jsp");
}
转发与重定向的区别
什么是转发
当客户端发送一个请求到服务器后,Web服务器在容器内部完成请求跳转,客户端的URL地址不会发生改变。
他的实现使用的是request的getRequestDispatcher()方法得到RequestDispatcher对象,此对象用于封装一个由路径所标识的服务器资源,然后用这个对象调用forword()方法,讲请求转递给服务器上另一个JSP页面或者HTML文件。相当于复制了要跳转页面的内容然后覆盖给前面一个页面。因而上次请求中的数据不会丢失。
示例:
处理页面:
if(name!=null){
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}
欢迎页面:
<%
String name=request.getParameter("name");
%>
欢迎<%=name %>进入本页面
效果:
看出URL还是处理页面的URL,而且可以获取到name。
什么是重定向
使用的是requese对象的sendRedirect()方法,改方法执行的结果是客户端重新向服务器请求一个地址链接,由于是发送新的请求,因而上去请求中的数据会随只丢失,URL地址也会显示新的URL地址。
示例:
处理页面
if(name!=null){
response.sendRedirect("welcome.jsp");
}
欢迎页面:
<%
String name=request.getParameter("name");
%>
欢迎<%=name %>进入本页面
效果:
看出页面URL地址栏发生了改变,而name获取不到。
总结:
关于转发和重定向,通俗的讲转发就像是你向售后技术支持打电话问问题,打过去是客服小王接的,但是小王无法解决,他让你等会儿,别挂电话,然后他去把问题告诉小李,让小李过来帮你解决,虽然换了人解决可是还是在这个售后处解决了问题。而重定向呢,就是小王说这个不归他们管,我们处理不了,让你打给12315投诉吧。然后你打电话给12315投诉解决了。
当Web容器收到客户端的发送过来http请求,会针对每一次请求,分别创建一个用于代表此次请求的HttpServletRequest对象(request)对象、和代表响应的HTTPServletResponse对象(response)。
重定向有两次请求
转发只有一次
从上面重定向可以看出在欢迎页面拿不到name,那么如果这时候又要想获取怎么办呢,就可以用查询字符串了或者session会话。查询字符串是什么可以看下面的介绍。
查询字符串
if(name!=null){
response.sendRedirect("welcome.jsp?name="+name);
}
<a href="color.jsp?color=红色">红色</a>
如果需要传递多个数字使用“&”符号连接。
在我多次验证后我发现重定向使用查询字符串怎么都没办法传递中文,但是超链接可以传递中文,有看到的大神可以指导一下。谢谢!
转载:https://blog.csdn.net/weixin_45496051/article/details/105822727