Servlet的介绍和实现

Servlet是java早期的靠java语言编写的Web服务器端技术,可以实现前后端的交互,Servlet对每个请求都是单独启动一个线程。

Servlet的实现(工具例如eclipse以及服务器Tomcat)
准备工作
1.导入Tomcat服务器
2.创建dynamic web project设置版本为2.5
3.把project添加入服务器

新建Servlet
1、src中新建包以及普通Java类
2、继承HttpServlet类/实现Servlet接口/继承GenericServlet类
3、重写service方法
4、设置web.xml配置文件

eg.在class文件中继承实现类(extends,implements)↓

1.public class Servlet01 extends HttpServlet {
		@Override
		protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
			System.out.println("Hello Servlet!");
		}
}

2.public class Servlet02 implements Servlet {
	/**
	 * 系统方法,servlet销毁时执行,关闭服务器销毁(只会执行一次)
	 */
	@Override
	public void destroy() {
		System.out.println("Servlet02 destroy...");
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		System.out.println("Servlet02 init...");
	}
	
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("Servlet02...");
	}
}

3.public class Servlet03 extends GenericServlet {

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		System.out.println("Servlet03...");
	}
}

在web-INF中的web.xml配置对应java文件

在</welcome-file-list>标签后以及</web-app>标签前配置
eg.
	<servlet>
	<servlet-name>Servlet01</servlet-name>
	// 给服务器看,servlet的名称,要与 servlet-mapping 标签中的 servlet-name保持一致
	<servlet-class>com.shsxt.servlet.Servlet01</servlet-class>
	//Servlet类的路径(有包名要加包名,按住"ctrl"键能点进去)
	</servlet>
	
	<servlet-mapping>
	<servlet-name>Servlet01</servlet-name>
	//给浏览器看,servlet的名称,要与 servlet 标签中的 servlet-name保持一致
	<url-pattern>/ser01</url-pattern>
	<!-- servlet的对外访问路径 -->
	</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>

继承HttpServlet后的一些功能

refresh(自动刷新或跳转)

eg.跳转,3秒后跳转到百度
resp.setHeader("refresh", "3;http://www.baidu.com");
  • getWriter()获取字符流(只能响应,回字符)
resp.getWriter().write("Hello");
resp.getWriter().write("<input type='text' value='123' />");
  • getOutputStream()获取字节流(能响应一切数据)。
resp.getOutputStream().write("<h2>Hello2</h2>".getBytes());

响应回的数据到客户端被浏览器解析。
注意:两者不能同时使用。
setContentType() 设置数据的响应类型

  • 响应乱码问题
    乱码原因:
    服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。
    注:如果服务端和客户端编码一致,但编码不支持中文,也会乱码。

  • 乱码情况:
    getWriter()的字符乱码
    对于 getWriter()获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。
    设置服务端的编码
    resp.setCharacterEncoding(“UTF-8”);

    getOutputStream()字节乱码
    对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示。

  • 解决方案:
    同时设置服务端和客户端的编码及响应类型
    resp.setContentType(“text/html;charset=UTF-8”);

  • 总结:
    要想解决响应的乱码,只需要保证使用支持中文的编码格式。并且保证服务器端 和客户端使用相同的编码方式即可。
    setContentType() 设置数据的响应类型及编码

重定向

  • 重定向是一种服务器指导,客户端的行为。户端发出第一个请求,被服务器接收,经过处理服务器进行响应,与此同时,服务器给客户端一个地址(下次请求的地址 resp.sendRedirect(“url”);)

请求转发和重定向区别

  • 请求转发
 req.getRequestDispatcher("url).forward(req, resp);
req.getRequestDispatcher("http://www.baidu.com").forward(req, resp);

1、地址栏不发生改变
2、服务端跳转
3、只有一次请求
4、request作用域共享 (一次请求中有效)
5、跳转的地址定位到站点名后 (请求转发到当前项目的资源路径)

  • 重定向
    resp.sendRedirect("http://www.baidu.com"); resp.sendRedirect("url");
    1、地址栏发生改变
    2、客户端跳转
    3、存在两次请求
    4、request作用域不共享
    5、跳转的地址定位到http (可以重重定向到任意地址)

路径问题

  • 相对路径
    相对于当前资源的路径
  • 绝对路径
    资源的完整路径
  • 完整绝对路径
    http://开头的,该种绝对路径已经跨域,即任何地方的资源都能访问
  • 部分绝对路径
    以"/"开头,从当前域名|IP|主机后的端口号开始的,不能跨域
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值