JavaWeb
JavaWeb是所有通过Java语言编写的可以通过浏览器访问的程序的总称。
请求:客户端发送请求,服务器端接收到请求
响应:通过服务端给客户端响应数据
web资源按实现的技术和呈现的效果的不同,分为静态资源和动态资源。
静态资源:html,css,js,txt,mp4视频,jpg图片
动态资源:jsp画面,Servlet程序
Tomcat使用
目录介绍:
bin 专门用来存放Tomcat服务器的可执行程序
conf 专门用来存放配置文件
lib 专门用来 存放jar包
logs 专门用来 存放日志文件
temp 专门用来存放运行时产生的临时数据
webapps 专门用来存放部署的web工程
work 是Tomcat工作时的目录
Tomcat在访问地址没有工程名时默认访问ROOT工程(http://ip:port/)
在没有资源名时默认访问index.html页面(http://ip:port/工程名)
在Tomcat的bin目录下用命令启动Tomcat服务器
catalina run
如果需要更改端口号,在conf中的server.xml中更改
Servlet
Servlet是Java EE规范之一,是运行在服务器上的一个Java小程序,他可以接收客户端发送过来的请求,并响应数据给客户端。
如果浏览器端想要访问后端的资源,需要在web.xml进行后端资源的注册以及资源路径的配置
<!--注册Servlet资源-->
<servlet>
<!--给注册的Servlet资源起的别名-->
<servlet-name>Servlet01</servlet-name>
<!--当前资源的全类名(权限定类名)--><!--包结构加类名-->
<servlet-class>com.shizi.servlet.Servlet01</servlet-class>
</servlet>
<!--配置资源路径-->
<servlet-mapping>
<!--对应要配置的资源的别名-->
<servlet-name>Servlet01</servlet-name>
<!--资源路径的配置-->
<url-pattern>/</url-pattern>
</servlet-mapping>
1、开发servlet的三种方法
(1)实现javax.servlet.Servlet接口(实现里面的五个方法即可)
servlet的实例在浏览器发起调用后,由Tomcat创建,构造方法和初始化方法都只被调用一次
浏览器和servlet要根据service()方法做一个分发处理(根据不同的提交方式做分发处理)
(2)继承javax.servlet.GenericServlet类(实现该类的service方法即可)
javax.servlet.GenericServlet实现了javax.servlet.Servlet接口,并实现了除service()方法之外的其他方法,因此我们用这种方法创建Servlet时只用覆盖父类的service()方法。
(3)继承javax.servlet.HttpServlet类(实现该类的doGet和doPost方法即可)
javax.servlet.HttpServlet类继承了javax.servlet.GenericServlet类,主要用于http协议处理的web应用。该类提供了doGet方法和doPost方法供程序猿重写。web使用get方式提交时调用doGet方法,web使用post方式提交时调用doPost方法。
Servlet生命周期
1、浏览器根据地址来发起调用,tomcat服务器在接收到请求之后会根据地址栏上的地址进行一个数据的解析,会找到具体的工程,然后再定位工程下面具体的资源
2、执行Servlet构造器方法
(创建servlet实例):定位到资源以后,会创建当前servlet类的实例,调用的是无参构造方法!
3、会执行初始化init方法,初始化servlet上下文配置对象servletConfig
4、会去执行service方法,service方法以后我们用来执行请求的分发处理
5、当容器关闭的时候,会执行销毁的方法destroy
Servlet被销毁的三种情况:web应用reload、关闭tomcat、关机
/**
* 浏览器在调用的时候,无论如何都会执行的方法
* 分发请求
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service被调用");
}
service方法中的参数,ServletRequest和ServletResponse是接口,不能实例化对象,所以该方法传入的对象是其子类的对象,该子类是HttpServlet。
ServletRequest所传的实现类是HttpServletRequest,里面提供了获取浏览器提交类型属性的方法,
ServletResponse所传的实现类是HttpServletResponse
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service被调用");
//强转为HttpServletRequest
HttpServletRequest request = (HttpServletRequest)servletRequest;
String method = request.getMethod();
System.out.println("提交方式"+method);
}
强转为HttpServletRequest是因为浏览器使用的是http协议
getMethod()用于获取浏览器提交方式(get或者post)
浏览器直接发起调用的提交方式是get
ServletConfig和ServletContext是Servlet的两个核心对象
ServletConfig:主要获取资源的加载信息和初始化信息
HttpServlet继承了GenericServlet,GenericServlet实现了Servlet,ServletConfig和Serializable。
GenericServlet中有一个getServletConfig()方法用于获取配置信息,比如资源的别名。
在web.xml用可以设置初始化信息:
<servlet>
<servlet-name>servlet01</servlet-name>
<servlet-class>com.jy.servlet.Servlet01</servlet-class>
//设置初始化信息,以键值对形式,<param-name>为键
<init-param>
<param-name>username</param-name>
<param-value>password</param-value>
</init-param>
</servlet>
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//获取初始化信息
System.out.println("-----"+servletConfig.getInitParameter("username"));
}
Servlet上下文对象(又叫Servlet域对象):ServletContext
作用:可以像map一样存储数据,可以获取全局共享初始化数据
域:取值的范围
ServletContext的作用域范围是整个工程,生命周期是从Servlet创建到销毁,即当Servlet的实例被创建,ServletContext就也被创建,在当前工程任意一个类获取的ServletContext都是同一个,它的内存地址永远是相同的。在当前工程的任何地方都能获取到ServletContext中的数据。
<!--配置全局共享数据或者说ServletContext上下文初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost/3306</param-value>
</context-param>
获取方法:
1、根据getServletConfig()的对象servletconfig获取
2、在HttpServlet中直接获取,HttpServlet的父类有getServletContext()方法
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Servlet配置对象
ServletConfig servletConfig = getServletConfig();
//获取Servlet域对象
ServletContext servletContext = servletConfig.getServletContext();
//向ServletContext中存值的方法,键值对形式
//ServletContext的作用域范围是Servlet的整个生命周期
servletContext.setAttribute("asdf","sfd");
//获取域中数据方法servletContext.getAttribute()
Object asdf = servletContext.getAttribute("asdf");
Object sfd = servletContext.getAttribute("sfd");
//获取全局共享初始化数据的方法servletContext.getInitParameter()
String url = servletContext.getInitParameter("url")
}
servletContext.setAttribute(,)是往域中存值,以键值对形式,servletContext.getAttribute()是获取域中的数据,servletContext.getInitParameter()是获取全局共享初始化数据
**HTTP协议
HTTP 是一种 超文本传输协议(Hypertext Transfer Protocol)
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范**
请求分为get请求和post请求
**get请求
**
1、请求行
1)请求方式get
2)请求的资源路径【+?+请求参数】
3)请求的协议的版本号HTTP/1.1
2、请求头
key:value组成不同的键值对,表示不同的含义
例如:
POST请求
1、请求行
1)请求方式post
2)请求的资源路径【+?+请求参数】
3)请求的协议的版本号HTTP/1.1
2、key:value组成不同的键值对,表示不同的含义
3、请求体:就是发送给服务器的数据
get请求会把所有的数据拼接在地址栏上,所以没有请求体。
get提交方式不能在地址栏中手动拼接参数,它会在你输入数据后解析到地址栏上,所以get方式不够安全, post提交方式可以手动输入数据在地址栏上。
get方式,通过在text框中输入数据,解析后数据会显示在地址栏上:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
//<form action="http://localhost:8080/test/05?username=root&password=root" method="get">
//这样直接手动在地址拼接是不行的
<form action="http://localhost:8080/test/05" method="get">
<input type="text" name="username">
<input type="text" password="password">
<input type="submit" value="提交">
</form>
</body>
</html>
post方式
可以直接在地址栏后手动拼接数据,也可以不拼接。
若是不拼接提交后数据不会显示在地址栏,而是在请求体(form data)中;若是拼接,所拼接参数会显示在地址栏中;若是在text框输入了数据,且地址栏中拼接了参数,则参数会显示在地址栏和query string parameter 中,所输入数据则在请求体(form data)中。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<form action="http://localhost:8080/test/05?username = zs&password=root" method="post">
<input type="submit" value="提交">
</form>
</body>
</html>
常用响应码说明:
200表示请求成功
302表示请求重定向
404表示请求地址错误
500表示服务器收到请求,但服务器内部错误,即代码错误
HttpServletRequest类
每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet和doPost)中给我们使用。我们可以通过HttpServletRequest对象,获取到所有请求的信息。
HttpServletRequest类的常用方法:
1)getRequestURI() 获取资源路径
2)getRequestURL() 获取请求的统一资源定位符(绝对路径)
3)getRemoteHost() 获取客户端的ip地址
4)getHeader() 获取请求头
5)getParameter() 获取请求的参数(当参数有多个值时,只获取第一个)
6)getParameterValues() 获取请求的参数(多个值的时候使用)
7)getMethod() 获取请求的方式
8)setAttribute(key,value) 设置域数据
9)getAttribute(key) 获取域数据
10)getRequestDispater(“xxx”) 获取请求转发对象(括号中参数是要转发的资源路径)
doGet方法的参数request也是域对象,作用域是一次请求之内,即地址栏上的地址没有变化。
例如有两个demo,在demo01中设置request域对象值,在demo02中获取值,是无法获取到的,因为会先执行demo01,在执行demo02,从demo01到demo02地址是变化了的。但如果demo01使用请求转发,指向demo02,是可以获取到的,此时地址没有变化。
请求转发
(
使用相对路径)
指的是服务器收到请求后,从一个资源跳转到另一个资源的过程。
//其中参数为资源路径,不是绝对路径
RequestDispatcher requestdispatcher = request.getRequestDispatcher("/hello")//请求转发
requestdispatcher.forward(request,response); //指向具体的资源
HttpServletResponse类
每次只要有请求进入Tomcat服务器,Tomcat服务器就会创建一个Response对象传递给Servlet程序使用。HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来设置。
http响应由状态行、实体内容、消息头、一个空行组成。HttpServletResponse对象就封装了http响应的信息。
往客户端回传数据
字节流和字符流对象不能同时存在
字节流getOutputStream()
常用于下载(传递二进制数据),返回的字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。使用ServletOutputStream对象也能输出内容全为文本字符的网页文档,但如果网页文档内容是在Servlet程序内部使用文本字符串动态拼凑和创建出来的,则需要先将字符文本转换成字节数组后输出。
字符流getWriter()
常用于回传字符串(常用),将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返回,PrintWriter对象可以直接输出字符文本内容。PrintWriter对象输出字符文本内容时,它内部还是将字符串转换成了某种字符集编码的字节数组后再进行输出,使用PrintWriter对象的好处就是不用编程人员自己来完成字符串到字节数组的转换。
[
](https://blog.csdn.net/liushijiao258/article/details/8128210)
响应的乱码解决
setContentType(“text/html;charset=UTF-8”)
请求重定向
(使用绝对路径)
请求重定向,指的是客户端给服务器发请求然后服务器告诉客户端去新地址访问。(旧地址可以已经废弃)
请求重定向使用的是response对象
1、原始方法(源代码方式)
//请求重定向
response.setStatus(302);
//设置响应头,执行地址的跳转
response.setHeader("location","https://www.baidu.com/");
2、用sendRedirect()方法
//方案二
response.sendRedirect("https://www.baidu.com/");
请求重定向是进行了两次请求的,所以不能通过请求重定向进行request域对象的请求转发。重定向在执行中会发生地址的跳转,并且不共享request域中的数据。