Java学习笔记-Day54 Servlet与JSP(二)
一、Servlet和JSP的作用
Servlet:后台接口,提供数据给前台的程序,从业务层获取数据。Servlet是不会用来生成动态页面的,而是会用来接收来自JSP的请求,处理请求,然后转到JSP页面显示结果给客户端。
JSP:负责和用户交互、展示数据、用户输入,操作符合用户习惯且美观。JSP适合生成动态页面,因为其中的静态部分可以直接使用HTML即可。
二、Servlet和JSP的交互
(1)从 Servlet 传递数据给 JSP
-
Servlet:① 通过内置对象request ( HttpServletRequest ) 的setAttribute方法设置数据。② 通过内置对象session ( HttpSession ) 的setAttribute方法设置数据。
-
JSP:① 通过内置对象request ( HttpServletRequest ) 的getAttribute方法获取数据。② 通过内置对象session ( HttpSession ) 的getAttribute方法获取数据。
(2)从 JSP 传递数据给 Servlet
-
JSP:① 提交表单。② url传值 ( 类似于表单的get提交 )。
-
Servlet:① 通过内置对象request ( HttpServletRequest ) 的getParameter方法获取请求参数 ( 单个字符串 )。② 通过内置对象request ( HttpServletRequest ) 的getParameterValues方法获取请求参数 ( 字符串数组 )。
注意:
① 如果获取到的是 null 值,可以在代码中添加 if 语句用来判断获取的值是否为null。创建默认值为空字符串的变量,如果判断值不为null,则将获取的值赋给改变量。
② 如果出现中文乱码,程序一开始就要设置请求编码的格式为utf-8( 只对post有效 ),JSP的表单提交方式要设置成 post 。JSP中的编码格式也要设置成utf-8。
request.setCharacterEncoding("utf-8");
String keywords="";
if(request.getParameter("keywords")!=null) {
keywords = request.getParameter("keywords");
}
三、Servlet和JSP之间的跳转方式
1、转发
转发:速度快,地址栏不变,是服务端的内部行为,和浏览器没有任何关系,浏览器只获取服务端传递过来的数据。只能在当前项目内部进行转发。
请求转发也叫直接转发方式(Forward),客户端和浏览器只发出一次请求,Servlet、HTML、JSP或其它信息资源,由第二个信息资源响应该请求,在请求对象request中,保存的对象对于每个信息资源是共享的。
实现转发方式一:
RequestDispatcher接口定义了请求转发的方法:
方法声明 | 方法描述 |
---|---|
forward(ServletRequest request, ServletResponse response) | 将请求转发到服务器上的其他资源,包括其他的Servlet,JSP等。 |
要使用forward方法,需要先获得RequestDispatcher对象。请求接口ServletRequest中提供了获得该对象的方法:
方法声明 | 方法描述 |
---|---|
RequestDispatcher getRequestDispatcher(java.lang.String path) | 使用path返回一个RequestDispatcher 对象。 |
// 从servlet跳转到jsp页面
request.getRequestDispatcher("a.jsp").forward(request, response);
实现转发方式二:jsp动态。
<jsp:forward page="url地址"></jsp:forward>
2、重定向
重定向:速度快,地址栏会发生变化,重定向每次请求都和浏览器有关,可以重定向到任何页面(不是在当前项目中的页面也可以重定向)。
重定向也叫间接转发方式(Redirect),实际是两次HTTP请求,服务器端在响应第一次请求的时候,让浏览器再向另外一个URL发出请求,从而达到转发的目的。
实现重定向方式一:
响应接口HttpServletResponse中提供了重定向的方法:
方法声明 | 方法描述 |
---|---|
void sendRedirect(java.lang.String location) | 重定向到 location 地址,相当于客户端重新请求location所在的资源。 |
response.sendRedirect("a.jsp");
实现重定向方式二:html的a标签。
<a href="url地址"></a>
实现重定向方式三:表单的get请求(post不是重定向)。
<form action="ts.do" method="get"></form>
实现重定向方式四: jstl的标签。
<c:redirect url="ts.do"></c:redirect>
实现重定向方式五:javascript的重定向。
<script>
location.href="ts.do";
</script>
3、Servlet和JSP之间的跳转
3.1、Servlet跳转到JSP
(1)转发(只能转发到当前项目文件中,可以携带数据)
request.setAttribute("list", list);
request.getRequestDispatcher("index.jsp").forward(request, response);
(2)重定向(可以重定向到本项目文件中,也可以重定向到外部项目的URL地址中)
response.sendRedirect("../../../../admin/admin.jsp");
3.2、JSP跳转到Servlet
(1)转发(只能转发到当前项目文件中,可以携带数据)
- 方式一:
<%
request.setAttribute("key", "value");
request.getRequestDispatcher("ts1.do").forward(request, response);
%>
- 方式二:
<jsp:forward page="ts1.do"></jsp:forward>
(2)重定向(可以重定向到本项目文件中,也可以重定向到外部项目的URL地址中)
- 方式一:
<%
response.sendRedirect("ts1.do");
%>
- 方式二:
<a href="ts1.do" >跳转到servlet</a>
- 方式三:
<form action="ts1.do" method="get"></form>
- 方式四:
<script>
location.href="ts1.do?...";
</script>
- 方式五:
<c:redirect url="ts.do"></c:redirect>
四、客户端访问服务器端Servlet的方式
客户端访问服务器端Servlet的方式有三种,分别是:
(1)直接从地址栏输入URL访问:直接使用URL访问,是GET方式,调用doGet方法。
(2)在网页中点击超级链接访问:超级链接访问,是GET方式,调用doGet方法。
- html或JSP中:
<!-- 传递数据的方式: url传值 ?key=value&key=value key为参数名 -->
<a href="a.do?name=tom&pwd=123456">提交请求到Servlet</a>
- Servlet的doGet方法中:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取url传递过来的值
String name = request.getParameter("name");//变量name的值为tom
String pwd = request.getParameter("pwd");//变量pwd的值为123456
System.out.println("name :"+name+", pwd :"+pwd);
}
(3)在网页中通过表单提交访问:表单提交访问,取决form的method属性的值,默认是get,指定为post时,调用doPost方法。
- html或JSP中:
<!-- 传递数据的方式: 表单传值 get方法 ?key=value&key=value key为参数名 -->
<form action="ts.do" method="get">
<input type="text" name="name" value="tom"><br/>
<input type="password" name="pwd" value="123456"><br/>
<input type="submit" value="提交">
</form>
- Servlet的doGet方法中:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取url传递过来的值
String name = request.getParameter("name");//变量name的值为tom
String pwd = request.getParameter("pwd");//变量pwd的值为123456
System.out.println("name :"+name+", pwd :"+pwd);
}