Servlet与JSP基础知识

Servlet

1、什么是Servlet

是sun公司制定的一种用来扩展web服务器功能的组建规范。
扩展web服务器功能:
       web服务器(比如apache,iis等)只能够处理静态资源的请求,(即,需要事先将html、图片等资源准备好,并且存放到web服务器上),不能够处理动态资源的请求(需要通过计算,生成相应的htmL),所以需要扩展其功能。可以使用servlet来扩展web服务器的功能。当请求到达web服务器,如果需要计算,则web服务器调用servlet来处理。
什么是组件:符合一定规范,实现部分功能,需要部署到相应的容器里面才能运行的软件模块。
servlet就是一个符合servlet规范的组件,需要部署到servlet容器里面才能运行。
servlet只需要关注业务逻辑,servlet容器会提供运行环境(包括网络相关的服务)。
什么是容器:符合一定规范,为组件提供运行环境的一种程序。如:Tomacat,就是一个servlet容器

2、如何写一个servlet

*Step1:写一个java类,实现Servlet接口或者继承HttpServlet类(HttpServlet类实现了Servlet接口中的部分方法)
*Step2:编译(使用javac命令将.java文件编译成.class文件)
*Step3:打包
	注:建立一个具有如下结构的文件夹(tomcat/webapps/examples)
		webapps
			WEB-INFO
				classes	(.class文件)
				lib		(.jar文件,该文件可选)
				web.xml	(部署描述文件)
*Step4:将step3创建好的整个文件夹拷贝到servlet容器指定的位置
		(可以将整个文件夹使用jar命令压缩成 .war 后缀的文件)
*Step5:启动容器,访问servlet。
		http://ip:port/appname/url-pattern	(url-pattern是一个字符串,在web.xml中设置)

3、安装并且配置Tomcat (www.apache.org)

下载压缩包,解压即可。
配置教程:https://www.cnblogs.com/dgj15222301178/p/7834815.html.

4、servlet是怎么运行的

比如输入:http://localhost:8080/dayo1/hello

  • step1:浏览器依据 ipport 建立连接。

  • step2:浏览器将相关数据添加到请求数据包里面,然后发送给服务器。

  • step3:服务器会解析请求数据包中的数据,并且将这些数据添加到request对象里面,同时,还会创建一个response对象。

    注意:
    开发人员可以通过request对象获得请求数据包中的数据,比如获得请求参数值。可以将处理结果写到response对象里面,容器会从response对象中获取处理结果,然后创建响应数据包并发送给浏览器。

  • step4:服务器创建servlet对象(实例化),然后调用该对象的service方法。

    注意:
    容器会将request对象和response对象作为参数传递过service方法。

  • step5:服务器从response对象中获取处理结果,然后创建响应数据包并发送给浏览器。

  • step6:浏览器解析响应数据包,依据解析到的数据生成相应的页面。

5、常见错误

404 
	404是一个状态码,表示服务器一依据请求路径找不到对应的资源
	原因:请求路径写错
		格式:http://ip:port/appname/url-pattern
		应用没有部署或者部署失败
500
	500是一个状态码,表示服务器运行出错。
	原因:代码没有严格遵守servlet规范
		比如:没有实现servlet接口或者继承HttpServlet类。
		web.xml文件中将servlet-class写错或者servlet-name不一致
		/*启动服务器失败可能是web.xml文件中出错(大小写或者不对应,或者类名写错)*/
		 代码不严谨
		
		比如:对请求参数没有做检查就做类型转换
405405是服务器找不到处理方法
	service方法没有按照正确的格式来书写,即没有正确override HttpServlet的service方法

http协议

(1)什么是http协议

网络应用层协议,规定了浏览器与web服务器之间如何通信以及相应的数据包的格式。
注: TCP/IP 属于网络层和传输层协议,负责将数据可靠地从一台机器传递到另外一台机器。
Http 属于应用层协议,将数据打包之后会将数据包交给tcp/ip来传递这些数据包。
(1) 浏览器与web服务器之间是如何通信
       step1:建立连接。
       step2:发送请求。
       step3:发送响应。
       step4:关闭连接。
如果浏览器要发送新的请求,需要重新建立新的连接,即“一次请求一次连接。”这样做的好处是服务器可以利用有限的连接尽可能完成多的请求服务。
==(2)==数据包的结构
   请求数据包:
       请求行->请求方式 请求资源路径 通信协议
       消息头->键值对 使用“: ”隔开,通信双方可以利用消息头发送一些特定的消息。比如浏览器可以通过发送user-agent消息头来告诉服务器,浏览器的类型和版本号。
  实体内容->消息正文
  响应数据包:
       状态行->协议和版本 状态码 状态描述
       注:状态码是一个三位数字,表示服务器处理请求的一种状态。
   消息头->
       注:服务器可以发送一些消息头给浏览器,比如:发送Content-Type消息头,告诉浏览器服务器返回的数据类型和编码方式。
   实体类容->
       注:程序处理的结果,浏览器会解析出来,生成相应的页面.

(2)两种请求方式

*GET请求:
	哪些情况下,浏览器会发送get请求:
		在浏览器地址栏输入某个地址
		表单默认的提交方式
		点击链接(超链接)
	特点:
		会将请求参数显示在浏览器地址栏,不安全
			注:某些网络设备会记录请求地址;会将请求参数添加到请求资源路径的后面,只能提交少量的数据给服务器。
			注:请求行大约只能存放2k左右的数据
*POST请求:
	哪些情况下,浏览器会发送post请求:
		将表单的method属性设置为post。
	特点:
		不会将请求参数显示在地址栏,相对安全一些。
			注:http协议并不会对数据包中数据进行加密,所以,对于敏感数据,一定要加密。
		会将请求参数添加到实体内容里面,可以提交大量的数据给服务器。

(3)Servlet输出中文,如何处理乱码问题?

xxx.println()方法默认会使用ISO-8859-1这个字符集来编码。如果是中文,则会发生编码错误,产生乱码问题。
解决方法:
	response.setContentType("text/html;charset=UTF-8");	//指定编码格式,分号隔开

读取请求参数值
	1、String weight = request.getParameter("weight").trim();
		注:如果请求参数名与实际传递过来的请求参数名不一致,则会获得null值
	2、String[] line = request.getParameterValues(String paramName);	
		注:有多个请求参数名相同时,使用此方法。对于多选框,如果没有选择任何选项,会获得null值,
			处理流程中容易出现空指针异常。
		处理空指针异常:
			if(line !=null){
   
				for (String value : line) {
   
					System.out.println(value);
				}
			}
						
表单包含有中文参数值,如何处理乱码问题?
1、为什么会有乱码
表单提交时,浏览器会对中文参数值进行编码(比如,使用utf-8来编码), 服务器端默认会使用ISO-8859-1来解码,所以,会产生乱码。
注:
	浏览器会使用打开该表单所在的页面时的字符集来进行编码
	<!-- 
		模拟Content-Type消息头
		相当于浏览器收到了一个Content-Type消息头,
		浏览器会按照指定的字符集进行解码。
	-->
	/*HTML指定字符集*/
	<meta charset="UTF-8">	
	/*JSP指定字符集*/
	<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

2、如何解决
POST请求:
		/*
		 * 设置请求参数值的解码方式。
		 * 注:
		 *  a.该方法一定要添加到所有的getParameter方法的前面。b.该方法只针对post请求有效。
		 * 设置请求参数值的解码方式必须与html的编码方式相同才能解决乱码问题
		 * 此行代码必须写在service方法的第一行
		 * 该方法只针对POST请求方式有效
		 */
		request.setCharacterEncoding("utf-8");	
GET请求:
		修改server.xml,<Connector URIEncoding="UTF-8"/>
		
		注:如果是tomcat8.0及以上版本,可以不用加(只针对GET请求方式)
3、POST与GET没有提交性能(效率)之分

详细讲解:https://www.cnblogs.com/ljx20180807/p/10412427.html

实操:
访问数据库
	*step1:建表
		create database jsd1808db default character set utf8;
		use jsd1808db;
		create table t_user(
			id int primary key auto_increment,
			username varchar(50) unique,
			password varchar(20),
			email varchar(30)
		);
	*step2:导包//jdbc与dbcp
		<dependencies>	
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>5.1.6</version>
			</dependency>

			<dependency>
				<groupId>commons-dbcp</groupId>
				<artifactId>commons-dbcp</artifactId>
				<version>1.4</version>
			</dependency>
		</dependencies>	
		
	*step3:添加jdbc.properties文件

	*step4:添加DBUtils类并测试。

	*step5:使用jdbc api访问数据库。
	
练习:写一个Servlet,以表格的形式显示所有用户的信息。	
	out.println("<table border='1' width='60%'>");
	while(rs.next()){
   
		int id = rs.getInt("id");
		String username = rs...
		String pwd = ..
		...
		out.println("<tr><td>" + id + "</td><td>" + username + "</td></tr>");
	}
	out.println("</table>");	

DAO (扩展)

(1)什么是DAO(Data Access Object)?
	封装了数据访问逻辑的一个对象。  

(2)如何写一个DAO?
	step1. 写一个java类,一般称之为值对象。
	注:
	该类用于存放从数据库中查询出来的数据。
	比如,要查询t_user表中的数据,就可以设计一个User类,该类的结构要与表的结构一致,也就说,表有哪些字段,类就会有对应的属性,属性类型要匹配。

	step2.写DAO类,提供一些访问数据库的方法。

(3)DAO的优点
	方便测试:
		将数据访问逻辑写在DAO类里面,可以直接测试,如果将数据访问逻辑写在servlet里面,需要部署整个应用才能测试。
	方便代码的维护:
		DAO封装了数据访问逻辑,调用者不用关心底层数据库相关的代码,比如,数据库访问逻辑发生了改变(从jdbc换成了mybatis),对调用者没有任何影响。

重定向<图redirect>

(1)什么是重定向?
	服务器通知浏览器向某个地址发送请求。
注:
	服务器可以通过发送302状态码及location消息头(该消息头的值是一个地址,一般称之为重定向地址)给浏览器,浏览器收到之后,会立即向重定向地址发送请求。
	
(2)如何重定向?
	response.sendRedirect(String url);
		例:response.sendRedirect("/WEB-INF/other.html");
注:
	url就是重定向地址。
	重定向之前,服务器会清空response对象上存放的所有数据。
	该方法会自动设置状态代码302	
(3)重定向特点
	A.重定向的地址是任意的
		response.sendRedirect(String url);	//String url任意地址
	B.重定向之后浏览器的地址栏会发生改变
		地址变为从定向的的地址

JSP

什么是JSP

jsp是sun公司制定的一种服务器端的动态页面技术规范。
      servlet也可以生成动态页面,但是过于繁琐,需要使用out.println语句来输出,并且不利于页面的维护,修改页面就需要修改java代码,所以sun公司才推出了jsp规范。
      jsp是一个以.jsp为后缀的文件(主要内容是html和少量的java代码),容器会将这个文件转换成一个对应的servlet然后执行。也就是说jsp的本质就是一个servlet。
      .jsp文件可以包含:html css js java 代码

如何书写JSP文件

step1:添加一个以.jsp为后缀的文件

step2:在该文件里面添加如下内容:
	1、html,css,js
		直接写即可
	2、java代码
		语法一:java代码片段   <% javaCode %>
		
直接使用隐含对象
在jsp文件里面可以直接使用的隐含对象
		9个内置对象:" page	config	out	 request response  session  application  pageContext exception "
	因为容器会自动添加获得这些对像的代码。

什么是指令

可以通过指令告诉容器,在将jsp转换成servlet时,做一些额外的处理,比如导包。
	指令语法
		<%@ 指令名 属性=值 属性=%>:如果有多个属性用空格隔开。
	
	page指令
		import属性:指定要导的包名,如果有多个包,用","号隔开。
		比如:
			<%@ page import="java.util.*,java.text.*"%>
		contentType属性:设置response.setContentType的内容。
		pageEncoding属性:告诉容器,在读取jsp文件的内容时,使用指定的字符集来解码。
		例:
			contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"
			
	include指令
		<%@ include file="" %>:
		file属性用于指定被包含的文件名。
		该指令用来告诉容器,在将jsp转换成servlet时,将file属性指定的文件的内容插入到该指令所在的位置。
		被包含的文件可以是任何文件,包括html,如果是jsp,该jsp并不会执行!
		
	taglib指令
		<%@ taglib uri="tagLibraryURI" prefix="tagPrefix" %>
		uri="tagLibraryURI"指明标签库文件的存放位置。prefix="tagPrefix"表示该标签使用时的前缀

如何书写java代码

第一种:
	<%@	page 导入包	%>	//导入需要的包,用逗号隔开
		例:<%@ page import="DAO.UserDAO,entity.User,java.util.*"%>
		
	<%  java代码   %>	//java代码片断,多行逻辑代码
	例:<%			
			Date date=new Date();
			String str="yyyy-MM-dd HH:mm:ss";	/*   HH:mm:ss*/
			SimpleDateFormat sdf=new SimpleDateFormat(str);
			String line=sdf.format(date);
			out.println(line);
		%>
第二种: 
	<%= java表达式 %>	//jsp表达式,单据执行语句,有返回值
	例:<%=user.getId() %>
第三种:
	<%!	Java代码 %>		//jsp数据定义,类定义
	例:
	<%!
		String str="<h2>JSP数据定义</h2>";
	%>

JSP如何运行

阶段一:
	容器先将jsp转换成一个servlet.
	html,css,js -->在service方法里面,使用out.write输出
	<% %> -->在service方法里面,照搬
	<%= %> -->在servlet方法里面,等效于使用out.println输出
	
阶段二:
	容器调用该servlet,执行相应业务方法。

转发

*什么是转发:(图forward.png)
	一个web组件将未完成的处理交给另外一个web组件继续做。
		注:
			web组件指的是servlet和jsp的统称。
			常见的情况是一个servlet获得数据之后,转发给一个jsp来展现这些数据。
*如何转发

	step1:绑定数据到请求对象上
		request.setAttribute(String name,Object obj);:
			name称之为绑订名,obj称之为绑订值。内部的实现,实际上是将数据放到了一个map对象里面。
			
	step2.获得转发器
		RequestDispatcher rd = request.getRequestDispatcher(String uri);:
			a.RequestDispatcher是一个接口,该方法会返回一个实现了该接口的对象(即转发器)。
			b.uri是转发的目的地,通常是一个jsp的地址。
			c.RequestDispatcher可以理解为是一个媒介,web组件可以通过RequestDispatcher来通知容器去调用另外一个web组件。
			d
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值