JavaWeb的概念
JavaWeb是指通过java语言编写可以通过浏览器访问的程序的总称叫javaweb
JavaWeb是基于请求和响应开发的
什么是请求?
客户端给服务器发送数据叫请求,request;
什么是响应?
客户端给服务器回传数据叫响应,reponse;
Web资源的分类
按实现的技术和呈现的效果不同,分为静态资源和动态资源;
静态资源:html、css、js、txt、jpg等等
动态资源:jsp页面、servlet程序等
Servlet技术
什么是servlet
1.servlet是JavaEE三大规范之一 ,规范就是接口
2.Servlet就是JavaWeb三大组件之一。三大组件分别是Servlet程序、Filter过滤器、Listener监听器.
3.Servlet是运行在 服务器上的一个Java小程序,它可以接收客户端发送过来的请求,并响应数据给客户端。
实现servlet程序
编写一个类实现servlet接口
实现service方法处理请求并响应数据
到web.xml中配置servlet程序的访问地址
servlet实现类
/**
* @create: 2022/1/15
* @author: Tony Stark
*/
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("第一个servlet程序");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>com.rpf.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/servlet</url-pattern>
</servlet-mapping>
</web-app>
访问
http://localhost:8080/servlet
输出
第一个servlet程序
注意
<url-pattern>中的路径要以/打头
ServlertContext类
什么是ServletContext?
1.ServletContext是一个接口,它表示Servlet上下文对象
2.一个web工程,只有一个ServletContext对象实例
3.ServletContext对象是一个域对象
什么是域对象?
域对象:可以像map一样存取数据的对象,叫做域对象。
存数据setAttribute 取数据getAttribute 删除数据removeAttribute
ServletContext类的四个作用
1.获取web.xml中配置的上下文参数context-param
2.获取当前的工程路径,格式:/工程路径
3.获取工程部署后在服务器磁盘上的绝对路径
4.像map一样存取数据
HTTP协议
所谓Http协议,就是指,客户端和服务器之间通信时,发送的数据,需要遵守的规则,叫Http协议。
Http协议中的数据又叫报文
请求的Http格式
常用请求头说明
Accept:表示客户端可以接收的数据类型
Accept-Langueue:表示客户端可以接收的语言类型
User-Agent:表示客户端浏览器的信息
Host:表示请求时的服务器ip和端口号
响应的HTTP协议格式
1.响应行
响应的协议和版本号
响应状态码
响应状态描述符
2.响应头
key:value 不同的响应头有其不同含义
响应头和响应体之间有空行隔开
3.响应体
就是回传给客户端的数据
常用的响应码说明
200 表示请求成功
302 表示重定向
404 表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)
500 表示服务器已经收到请求,但是服务器内部错误(代码错误)
MIME类型说明
是HTTP协议中的数据类型 类型格式 :“大类型/小类型”,并与某一种文件的扩展名相对应
请求的转发
什么是请求的转发
请求的转发是指,服务器收到请求之后,从一次资源跳转到另一个资源的操作叫做请求转发。
base标签的作用
base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。
Web中的相对路径和绝对路径
在javaWeb中,路径分为相对路径和绝对路径两种:
相对路径:
. 表示当前目录
.. 表示上一层目录
资源名 表示当前目录/资源名
绝对路径:
http://ip:port/工程路径/资源路径
web中 / 斜杠的不同意义
在web中 / 斜杠是一种绝对路径
/ 斜杠 如果被浏览器解析,得到的地址是:
http://ip:port/
/ 斜杠如果被服务器解析,得到的地址是
http://ip:port/工程路径
HTTPServletResponse类
HTTPServletResponse类的作用
HTTPServletRequest和HTTPServletResponse一样。每次请求进来,Tomcat服务器都会创建一个Response对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息。
如果我们需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置。
两个输出流
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个,使用了字节流,就不能在使用字符流,反之亦然,否则就会报错。
如何往客户端回传数据
要求:往客户端回传字符串数据
/**
* @create: 2022/1/17
* @author: Tony Stark
*/
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 同时告诉服务器和客户端使用的编码格式
resp.setHeader("Content-Type","text/html; charset=utf-8");
resp.setCharacterEncoding("utf-8");
//往客户端回传字符串数据
PrintWriter writer = resp.getWriter();
writer.print("response响应的字符串");
System.out.println(resp.getCharacterEncoding());
}
}
方式二
/**
* @create: 2022/1/17
* @author: Tony Stark
*/
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//它会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
resp.setContentType("text/html;charset=utf-8");
//往客户端回传字符串数据
PrintWriter writer = resp.getWriter();
writer.print("response响应的字符串");
System.out.println(resp.getCharacterEncoding());
}
响应头也设置为了UTF-8
注意:此方法一定在获取流之前设置才有效
请求重定向
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一个新地址你去新的地址访问,叫做请求重定向(因为之前的地址可能已经被废弃)。
例如我们去一家店铺,店铺搬迁了在门上贴条写搬到某某地址,你去某某地址找到店铺。
第一种方法:
//设置响应状态码302 代表重定向
resp.setStatus(302);
//设置响应头说明新的地址在哪里
resp.setHeader("Location","http://localhost:8080/responseTwo");
public class ResponseOne extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("房屋升级,店铺搬迁!!!");
//设置响应状态码302 代表重定向
resp.setStatus(302);
//设置响应头说明新的地址在哪里
resp.setHeader("Location","http://localhost:8080/responseTwo");
}
}
public class ResponseTwo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().write("房屋搬迁到这里了");
}
}
访问
http://localhost:8080/responseOne
页面显示
地址
http://localhost:8080/responseTwo
内容
房屋搬迁到这里了
第二种方式(推荐)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("房屋升级,店铺搬迁!!!");
resp.sendRedirect("http://localhost:8080/responseTwo");
}
重定向特点:
1.浏览器地址栏会发生变化
2.两次请求
3.不共享Request域中数据
4.不能WEB-INF下的资源
5.可以访问工程以外的资源