Servlet

一、servlet02
在这里插入图片描述
实现Servlet的四个步骤
1、新建普通class类
2、继承HttpServlet类
3、重写service()方法
4、配置web.xml

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial") // 抑制警告
public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet01...");
		
	}
	
}

在项目名下找到 WebContent----WEB-INF-----打开web.xml

配置web.xml

<?xml version="1.0" encoding="UTF-8"?> <!-- ?xml表示声明当前是xml文件;version表示当前xml的版本;encoding表示文件编码; 这句话一定要写在第一行 -->
<!-- web-app表示是当前xml文件的根节点,一个xml文件有且只有一个根节点  -->
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
   <!-- 当前项目的名称  -->
  <display-name>servlet01</display-name>
  <!-- 当访问该项目时,没有给定资源路径,会自动在welcome-file-list标签中查找配置好的路径,找到则显示,未找到报404 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <!-- 
  	注意点:
  		1、修改了xml配置文件中的数据,必须重启服务器才会生效
  		2、servlet标签中的servlet-name不能有相同的
  		3、servlet-mapping中的url-pattern的值不能有相同的
  			否则报错:The servlets named [servlet01] and [servlet02] are both mapped to the url-pattern [/ser01] which is not permitted
   		4、说明: url-pattern 可以配多个(一个 servlet 可以通过多个 url-pattern 访问)
   			通配符 “*”只能放在最前面或最后面,不能放中间且不能单独存在(以/分割的,不能和单词组成整体)。越精确越优先。
   -->
  
  <!-- 配置servlet -->
  <servlet>
  	<servlet-name>servlet01</servlet-name> <!-- 自定义名称,给服务器看的,与servlet-mapping标签中的servlet-name的值一致 -->
  	<servlet-class>com.shsxt.servlet.Servlet01</servlet-class> <!-- 当前配置的servlet类的路径;按住"ctrl"键 ,能点到类中表示路径正确-->
  </servlet>
  <!-- 配置servlet的映射  -->
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name> <!-- 自定义名称,给服务器看的,与servlet标签中的servlet-name的值一致 -->
  	<url-pattern>/ser01</url-pattern> <!-- 对外访问路径,给浏览器访问的;路径前要加"/" -->
  </servlet-mapping>
  </web-app>

2.常用方法

package com.shsxt.servlet;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 实现Servlet
 * 	1、新建普通class类
 * 	2、继承HttpServlet类
 * 	3、重写service()方法
 * 	4、配置web.xml
 * 
 * 
 * 	常用方法
 *
 */
@SuppressWarnings("serial") // 抑制警告
public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Servlet01...");
		
		// 常用方法
		// 获取请求的完整路径 (从http开始,到问号"?"结束)
		String url = request.getRequestURL() + "";
		System.out.println("获取请求的完整路径: " + url);
		
		// 获取请求的部分路径(从站点名开始,到问号"?"结束)
		String uri = request.getRequestURI();
		System.out.println("获取请求的部分路径: " + uri);
		
		// 获取请求的参数字符串  (从问号"?"开始,到最后)
		String queryString = request.getQueryString();
		System.out.println("获取请求的参数字符串: " + queryString);
		
		// 获取请求方式 (GET/POST)
		String method = request.getMethod();
		System.out.println("获取请求方式: " + method);
		
		// 获取站点名
		String contextPath = request.getContextPath();
		System.out.println("获取站点名: " + contextPath);
		
		
		// 获取协议版本
		String protocol = request.getProtocol();
		System.out.println("获取协议版本: " + protocol);
		
		
		// 获取指定名称的请求头的值  (key不区分大小写)
		String host = request.getHeader("host");
		System.out.println("Host: " + host);
		
		// 获取所有请求头名称的枚举集合
		Enumeration<String> enumerations = request.getHeaderNames();
		while (enumerations.hasMoreElements()) {
			String string = (String) enumerations.nextElement();
			System.out.println(string);
		}
		
		//  !!!!!! 获取指定名称的参数值
		String uname = request.getParameter("uname");
		System.out.println(uname);
	
	}

}

配置web.xml

 <!-- 配置servlet -->
   <servlet>
   		<servlet-name>servlet02</servlet-name><!-- 自定义名称,给服务器看的,与servlet-mapping标签中的servlet-name的值一致 -->
  		<servlet-class>com.shsxt.servlet.Servlet02</servlet-class> <!-- 当前配置的servlet类的路径;按住"ctrl"键 ,能点到类中表示路径正确-->
   </servlet>
   <!-- 配置servlet的映射  -->
  <servlet-mapping>
  	<servlet-name>servlet02</servlet-name> <!-- 自定义名称,给服务器看的,与servlet标签中的servlet-name的值一致 -->
  	<url-pattern>/ser02</url-pattern> <!-- 对外访问路径,给浏览器访问的;路径前要加"/" -->
  </servlet-mapping>

3.请求乱码解决
request 属于接收客户端的参数,所以必然有其默认的语言编码,主要是由于在解析过程中默认使用的编码方式为 ISO-8859-1(此编码不支持中文),所以解析时一定会出现乱码。

  • 要想解决这种乱码问题,需要设置 request 中的编码方式,告诉服务器以何种方式来解析数据。或者在接收到乱码数据以后,再通过相应的编码格式还原。

  • POST请求:Tomcat8及以上和Tomcat7及以下版本都会乱码

  • GET请求:Tomcat8及以上不会乱码,Tomcat7及以下会乱码

  • 方案一:
    设置请求的编码 (只针对于POST请求有效,必须在接收所有的数据之前设定)
    request.setCharacterEncoding(“UTF-8”);

  • 方案二:
    new String(request.getParameter(“参数名”).getBytes(“ISO-8859-1”),“UTF-8”);
    无论是GET请求还是POST请求都适用。一次只能处理一个参数

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet02 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet02...");
		
		/*方案一*/
		// 设置请求的编码(只针对于POST请求有效,必须在接收所有的数据之前设定)
		// req.setCharacterEncoding("UTF-8");
		
		// 接收前台传递的参数
		//String uname = req.getParameter("uname");
		// System.out.println(uname);
		
		
		/*方案二*/
		// new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");
		String uname = new String(req.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");
		System.out.println(uname);			
	}

}

配置web.xml

 <!-- 配置servlet -->
   <servlet>
   		<servlet-name>servlet03</servlet-name><!-- 自定义名称,给服务器看的,与servlet-mapping标签中的servlet-name的值一致 -->
  		<servlet-class>com.shsxt.servlet.Servlet03</servlet-class> <!-- 当前配置的servlet类的路径;按住"ctrl"键 ,能点到类中表示路径正确-->
   </servlet>
   <!-- 配置servlet的映射  -->
  <servlet-mapping>
  	<servlet-name>servlet03</servlet-name> <!-- 自定义名称,给服务器看的,与servlet标签中的servlet-name的值一致 -->
  	<url-pattern>/ser03</url-pattern> <!-- 对外访问路径,给浏览器访问的;路径前要加"/" -->
  </servlet-mapping>

4.request作为域对象
通过该对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。
request.setAttribute():设置域对象内容;
request.getAttribute(String name):获取域对象内容;
request.removeAttribute(String name): 删除域对象内容。
request 域对象中的数据在一次请求中有效,则经过请求转发,request 域中的数据依然 存在,则在请求转发的过程中可以通过 request 来传输/共享数据。

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet05 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet05....");
		
		// 设置request域对象
		req.setAttribute("user", "zhangsan");
		req.setAttribute("user2", "aa");
		req.setAttribute("user3", "bb");
		req.setAttribute("user4", "cc");
		
		
		// 移除域对象
		req.removeAttribute("user2");
		
		// 获取域对象的值
		String user = (String) req.getAttribute("user");
		System.out.println(user);
		
		String user2 = "lisi";
		
		// 请求转发跳转到index.jsp
		req.getRequestDispatcher("index.jsp").forward(req, resp);
		
	}

}

配置web.xml

 <!-- 配置servlet -->
   <servlet>
   		<servlet-name>servlet05</servlet-name><!-- 自定义名称,给服务器看的,与servlet-mapping标签中的servlet-name的值一致 -->
  		<servlet-class>com.shsxt.servlet.Servlet05</servlet-class> <!-- 当前配置的servlet类的路径;按住"ctrl"键 ,能点到类中表示路径正确-->
   </servlet>
   <!-- 配置servlet的映射  -->
  <servlet-mapping>
  	<servlet-name>servlet05</servlet-name> <!-- 自定义名称,给服务器看的,与servlet标签中的servlet-name的值一致 -->
  	<url-pattern>/ser05</url-pattern> <!-- 对外访问路径,给浏览器访问的;路径前要加"/" -->
  </servlet-mapping>

5.请求转发
请求转发,是一种服务器的行为.
当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的 URL 地址不会改变
得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。
实现方式如下,达到多个资源协同响应的效果
request.getRequestDispatcher(“请求的地址”).forward(request,response);

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet04 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet04....");
		
		// 接收参数
		System.out.println("Servlet04... name:" + req.getParameter("uname"));
		
	}
}

配置web.xml

 <!-- 配置servlet -->
   <servlet>
   		<servlet-name>servlet04</servlet-name><!-- 自定义名称,给服务器看的,与servlet-mapping标签中的servlet-name的值一致 -->
  		<servlet-class>com.shsxt.servlet.Servlet04</servlet-class> <!-- 当前配置的servlet类的路径;按住"ctrl"键 ,能点到类中表示路径正确-->
   </servlet>
   <!-- 配置servlet的映射  -->
  <servlet-mapping>
  	<servlet-name>servlet04</servlet-name> <!-- 自定义名称,给服务器看的,与servlet标签中的servlet-name的值一致 -->
  	<url-pattern>/ser04</url-pattern> <!-- 对外访问路径,给浏览器访问的;路径前要加"/" -->
  </servlet-mapping>

二、servlet03
在这里插入图片描述
下面几个实例都是一个项目中的所以web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>servlet03</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  <servlet>
  	<servlet-name>servlet01</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet01</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet01</servlet-name>
  	<url-pattern>/ser01</url-pattern>
  </servlet-mapping>
    
  <servlet>
  	<servlet-name>servlet02</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet02</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet02</servlet-name>
  	<url-pattern>/ser02</url-pattern>
  </servlet-mapping>
  
    <servlet>
  	<servlet-name>servlet03</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet03</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet03</servlet-name>
  	<url-pattern>/ser03</url-pattern>
  </servlet-mapping>
  
  
    
  <servlet>
  	<servlet-name>servlet04</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet04</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet04</servlet-name>
  	<url-pattern>/ser04</url-pattern>
  </servlet-mapping>
  
      
  <servlet>
  	<servlet-name>servlet05</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet05</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet05</servlet-name>
  	<url-pattern>/ser05</url-pattern>
  </servlet-mapping>
  
  
      
  <servlet>
  	<servlet-name>servlet06</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet06</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet06</servlet-name>
  	<url-pattern>/ser06</url-pattern>
  </servlet-mapping>
  
    <servlet>
  	<servlet-name>servlet07</servlet-name>
  	<servlet-class>com.shsxt.servlet.Servlet07</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>servlet07</servlet-name>
  	<url-pattern>/ser07</url-pattern>
  </servlet-mapping>
  
</web-app>

1.几种常用方法

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@SuppressWarnings("serial")
public class Servlet01 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet01...");
		// 添加响应头
		// resp.addHeader("name", "admin");
		
		// 设置错误状态码及说明
		// resp.sendError(404, "由于颜值过低,无法访问!");
		
		// 三秒钟后跳转到尚学堂官网
		// resp.setHeader("refresh", "3;url=http://www.shsxt.com");
			
		// 每隔2秒刷新一次
		resp.setHeader("refresh", "2");
		
	}

}

2.响应数据
接收到客户端请求后,可以通过 HttpServletResponse 对象直接进行响应,响应时需要获取输出流,

  • 有两种形式
  1. getWriter()获取字符流(只能响应回字符);

  2. getOutputStream()获取字节流(能响应一切数据)。

    响应回的数据到客户端被浏览器解析。
    注意:两者不能同时使用。
    
package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet02 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet02...");
		
		// 设置响应类型
		resp.setContentType("text/html;charset=UTF-8");
		
		// getWriter()获取字符流(只能响应回字符);
		//PrintWriter writer = resp.getWriter();
		//writer.write("<h4>Hello Servlet</h4>");
		//writer.close();
		
		// getOutputStream()获取字节流(能响应一切数据)。
		//OutputStream outputStream = resp.getOutputStream();
		//outputStream.write("<h4>Hello MyServlet</h4>".getBytes());
		//outputStream.close()
		
		//在eclipse中拼接表单
		String form = "<form action='ser02' method='get'>"
				+ "<div class='form-group'><label for='uname'>名称</label>"
				+ " <input type='text' class='form-control' name='uname'  placeholder='请输入名称'>"
				+ "</div> <div class='form-group'> <label for='upwd'>密码</label> "
				+ " <input type='password' class='form-control' name='upwd' placeholder='请输入密码'> </div>"
				+ " <button type='submit' >提交</button> </form>";
		resp.getWriter().write(form);
		resp.getWriter().close();
		
	}
	
}

3.乱码解决
如果响应的内容中含有中文,则有可能出现乱码。
这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。
getWriter()的字符乱码

  1. List item
    对于 getWriter()获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。
    所以要解决该种乱码只能在服务器端告知服务器使用一种能够支持中文的编码格式,
    比如我们通常用的“UTF-8” resp.setCharacterEncoding(“UTF-8”);,
    此时还只完成了一半的工作,要保证数据正确显示,还需要指定客户端的解码方式
    resp.setHeader(“content-type”, “text/html;charset=UTF-8”);,
    和服务器一致。两端指定编码后,乱码就解决了。
    一句话:保证发送端和接收端的编码一致

  2. getOutputStream()字节乱码
    对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示,这就看人品了_
    当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。
    无论如何我们都应该准确掌握服务器和客户端使用的是那种编码格式,以确保数据正确显示。指定客户端和服务器使用的编码方式一致即可 。

乱码的原因:
1、客户端和服务端编码不一致
2、编码不支持中文
解决方案:
保证客户端和服务端编码一致且支持中文

package com.shsxt.servlet;

import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet03 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet03...");
		
		/*  设置客服端和服务端的编码一致,并支持中文*/
		// 设置服务端的编码
		//resp.setCharacterEncoding("UTF-8");
		// 设置客户端的编码
		//resp.setHeader("content-type", "text/html;charset=UTF-8");
		
		
		// 使用一句代码代替上面两句
		resp.setContentType("text/html;charset=UTF-8"); // 设置响应类型及编码格式
		
		
		// getWriter()获取字符流(只能响应回字符);
		/*PrintWriter writer = resp.getWriter();
		writer.write("<h4>你好</h4>");
		writer.close();*/
		
		// getOutputStream()获取字节流(能响应一切数据)。
		OutputStream outputStream = resp.getOutputStream();
		outputStream.write("<h4>你好</h4>".getBytes());
		outputStream.close();
		
	}

}

4.响应图片

package com.shsxt.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 
 * 响应图片
 * 	
 *
 */
@SuppressWarnings("serial")
public class Servlet04 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("响应图片...");
		
		// 设置响应类型
		resp.setContentType("image/jpeg");
		// 得到项目在服务器中的真实路径
		String path  = req.getServletContext().getRealPath("/");
		// 得到图片的存放路径
		String filePath = path + "/WEB-INF/jay.jpg";
		// 通过路径得到file对象
		File file = new File(filePath);
		// 判断文件是否存在并且是一个标准文件
		if (file.exists() && file.isFile()) {
			// 得到输出流
			ServletOutputStream out = resp.getOutputStream();
			// 得到file对象的输入流
			InputStream in = new FileInputStream(file);
			
			// 输出
			byte[] car = new byte[1024];
			int len = 0;
			
			while((len = in.read(car)) != -1) {
				out.write(car, 0, len);
			}
			
			// 关闭资源
			out.flush(); // 刷新流
			in.close();
			out.close();
			
		} else {
			System.out.println("文件不存在!");
		}	
		System.out.println(path);
	}

}

5.重定向

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet05 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet05...");
		
		// 接收参数
		String uname = req.getParameter("uname");
		System.out.println("Servlet05 uname: " + uname);
		
		// 设置request域对象
		req.setAttribute("num", 1);
		
		// 重定向
		resp.sendRedirect("ser06");
	
	}

}

6.请求转发和重定向的区别

  • 请求转发

    1、只有一次请求,request作用域中的数据可以共享
    2、浏览器地址栏不发生改变
    3、服务端行为
    4、跳转的绝对地址可以定位到站点名后
    只能请求转发到当前项目下的资源

  • 重定向的区别

1、有两次请求,request作用域中的数据不可以共享
2、浏览器地址栏发生改变
3、客户端行为
4、跳转的绝对地址可以定位到http://后面
重定向可以定位到任意资源

请求转发和重定向不能同时使用
  • 路径问题

    相对路径
    路径的前面不要加任何符号,一般情况下代表的是: “http://localhost:8080/站点名/
    绝对路径
    1、以http://开头的,完整的绝对路径,可以跨域,可以访问任何资源
    2、以"/"开头,只能访问当前项目下的资源

  • 请求转发和重定向的"/"代表的含义:

    1、请求转发(服务端跳转):“http://localhost:8080/站点名/
    2、重定向(客户端跳转):“http://localhost:8080/

  • 客户端跳转

    表单提交、超链接跳转、地址栏直接收入、重定向

  • 服务端跳转:

    请求转发

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 
 * 	请求转发
 * 		1、只有一次请求,request作用域中的数据可以共享
 * 		2、浏览器地址栏不发生改变
 * 		3、服务端行为
 * 		4、跳转的绝对地址可以定位到站点名后
 * 			只能请求转发到当前项目下的资源
 * 
 * 
 * 	重定向的区别
 * 		1、有两次请求,request作用域中的数据不可以共享
 * 		2、浏览器地址栏发生改变
 * 		3、客户端行为
 * 		4、跳转的绝对地址可以定位到http://后面
 * 			重定向可以定位到任意资源
 * 	
 * 
 * 	请求转发和重定向不能同时使用
 * 
 * 
 * 	路径问题
 * 		相对路径
 * 			路径的前面不要加任何符号,一般情况下代表的是: "http://localhost:8080/站点名/"
 * 		绝对路径
 * 			1、以http://开头的,完整的绝对路径,可以跨域,可以访问任何资源
 * 			2、以"/"开头,只能访问当前项目下的资源
 * 
 *	请求转发和重定向的"/"代表的含义:
 *		1、请求转发(服务端跳转):"http://localhost:8080/站点名/"
 *		2、重定向(客户端跳转):"http://localhost:8080/"
 *
 *	客户端跳转:
 *		表单提交、超链接跳转、地址栏直接收入、重定向
 *	服务端跳转:
 *		请求转发
 * 
 *
 */
@SuppressWarnings("serial")
public class Servlet07 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet07...");
		
		// 请求转发
				// req.getRequestDispatcher("index.html").forward(req, resp); // OK
				// req.getRequestDispatcher("/index.html").forward(req, resp);  // OK
				// req.getRequestDispatcher("s03/index.html").forward(req, resp); //  No  HTTP Status 404 - /s03/s03/index.html
				// req.getRequestDispatcher("/s03/index.html").forward(req, resp);  //  No  HTTP Status 404 - /s03/s03/index.html
				// req.getRequestDispatcher("http://localhost:8080/s03/index.html").forward(req, resp); // No HTTP Status 404 - /s03/http://localhost:8080/s03/index.html
				// req.getRequestDispatcher("http://www.shsxt.com").forward(req, resp); // No  HTTP Status 404 - /s03/http://www.shsxt.com
				
				// 重定向
				// resp.sendRedirect("index.html"); // OK
				// resp.sendRedirect("/index.html"); // No http://localhost:8080/index.html
				// resp.sendRedirect("s03/index.html"); // No  HTTP Status 404 - /s03/s03/index.html
				// resp.sendRedirect("/s03/index.html"); OK 
				// resp.sendRedirect("http://localhost:8080/s03/index.html");
				resp.sendRedirect("http://www.shsxt.com");
		
	}
	
}

7.重定向

package com.shsxt.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Servlet05 extends HttpServlet {

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Servlet05...");
		
		// 接收参数
		String uname = req.getParameter("uname");
		System.out.println("Servlet05 uname: " + uname);
		
		// 设置request域对象
		req.setAttribute("num", 1);
		
		// 重定向
		resp.sendRedirect("ser06");	
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值