目录
一、JavaWeb核心介绍
JavaWeb技术栈
网站请求与响应的过程:首先浏览器发送请求(HTTP协议)到服务端,请求相关的资源,资源分为动态资源(Servlet)和静态资源(三剑客),动态资源就是java代码,这些java代码遵循一定的书写规范称为Servlet、jsp等相关规范,这些java代码可以负责逻辑的处理,并且对数据库进行访问操作,获取对应的数据给到对应的静态页面,页面再进行一些css样式处理,最后将这个页面返回给浏览器,称为响应。
二、HTTP协议
1、请求数据的格式
2、响应数据的格式
3、常见响应状态码![](https://i-blog.csdnimg.cn/blog_migrate/0b78a34f1f952202c4926650f4cf53c1.png)
三、Tomcat
1、Tomcat简介
2、Tomcat安装
不建议直接使用x关闭服务器,相当于拔电源,使用Ctrl+C
3、tomcat部署
4、IDEA中创建Maven Web项目
5、IDEA中使用tomcat
使用插件 在IDEA中快速使用tomcat,如果设置了插件的configuration,需要通过maven中的run方法运行,直接点击运行按钮不会按照插件设置的端口和访问路径运行,只能支持到tomcat7
四、Servlet
1、Servlet快速入门
<!--配置Maven中的编译版本-->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<!--导入Servlet依赖坐标-->
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<!--依赖范围:测试和编译-->
<scope>provided</scope>
</dependency>
</dependencies>
@WebServlet("/demo")
public class ServletDemo1 implements Servlet {
public void init(ServletConfig servletConfig) throws ServletException {
}
public ServletConfig getServletConfig() {
return null;
}
//service会自动执行,输出结果到控制台
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello world servlet");
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
2、Servlet执行流程
浏览器中输入的url分为了三部分:通过第一部分的路径能够访问到Tomcat服务器,通过第二部分能够访问到这个Web项目,通过第三部分能够访问到项目中的servlet,自动执行service()方法,而要执行这个service()方法必须创建Servlet对象,通过web服务器tomcat创建
3、Servlet生命周期
4、Servlet方法介绍
@WebServlet(urlPatterns = "/demo", loadOnStartup = 1)
public class ServletDemo1 implements Servlet {
/**
* 初始化方法
* 1、调用时机:默认情况下,Servlet被第一次访问时调用
*配置参数loadOnStartup:默认为-1,默认情况下的调用时机
*配置为0或正整数时,会在服务器启动时就初始化Servlet,而不是第一次访问时
* 2、调用次数:1次
*/
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init");
}
/**
* 提供服务的方法
* 1、调用时机:每一次Servlet被访问时调用
* 2、调用次数:多次,每访问一次就调用一次
*/
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//service会自动执行,输出结果到控制台
System.out.println("hello world servlet");
}
/**
* 销毁方法
* 1、调用时机:Servlet被销毁时(内存释放或者服务器关闭的时候)
* 2、调用次数:1次
*/
public void destroy() {
System.out.println("destory");
}
/**
* 返回一些作者、版本、版权等信息,一般返回空字符串
* @return
*/
public String getServletInfo() {
return null;
}
/**
* 获取Servlet配置对象
* @return
*/
public ServletConfig getServletConfig() {
return null;
}
}
5、Servlet体系结构
由于每次都是实现Servlet接口并重写五个方法,步骤过于繁琐,所以引入了Servlet实现类,使用HTTP协议封装Servlet,使得只需要继承HttpServlet实现类就能实现Servlet接口,重写HttpServlet的doGet()方法和doPost()方法即可。
HttpServlet 为什么要根据请求的方式不同,调用不同的方法?
由于get和post请求的请求方式不一样,所以需要分别处理
不同的方法如何调用?
先获取请求方式,然后采用不同的逻辑判断,是get请求就使用get方法,是post请求就使用post方法。
6、Servlet urlPattern配置
7、XML配置方式编写Servlet urlPattern
8、Request
@WebServlet("/demo3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1、使用request对象 获取请求数据
String name = request.getParameter("name"); //url?name=zhangsan
//2、使用response对象 设置响应数据
response.setHeader("content-type","text/html;charset=UTF-8");
response.getWriter().write("<h1>"+name+",欢迎您!</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
Request继承体系
Request获取请求数据
@WebServlet("/req1")
public class ServletDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//request获取请求行 GET/servlet1/req1?username=zhangsan HTTP/1.1
//1、获取请求方式 GET
String method = req.getMethod();
System.out.println(method);
//2、获取虚拟目录(项目访问路径,项目名) /servlet1
String contextPath = req.getContextPath();
System.out.println(contextPath);
//3、获取请求的URL(统一资源定位符) http://localhost:8080/servlet1/req1
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL.toString());
//4、获取请求的URI(统一资源标识符) /servlet1/req1
String requestURI = req.getRequestURI();
System.out.println(requestURI);
//5、获取请求参数(GET方式) username=zhangsan
String queryString = req.getQueryString();
System.out.println(queryString);
}
}
Request通用方式获取请求数据
使用通用的方式获取GET和POST请求参数,而不用对GET和POST使用不同的方法分别获取请求参数。
@WebServlet("/req2")
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//使用通用方式获取GET 和 POST 请求数据
System.out.println("get....");
//1、获取所有参数的map集合
Map<String, String[]> maps = req.getParameterMap();
//2、对map集合的键进行遍历
for (String key : maps.keySet()) {
System.out.print(key + ":");
//3、获取到的键对应的可能是一个数组,遍历这个值数组
String[] values = maps.get(key);
for (String value : values) {
System.out.print(value + " ");
}
System.out.println();
}
System.out.println("----------------------");
//4、根据key获取参数值(获取数组)
String[] hobbys = req.getParameterValues("hobby");
for (String hobby : hobbys) {
System.out.println(hobby);
}
//5、根据key获取单个值
String username = req.getParameter("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//直接调用GET请求的方法,避免代码重复
this.doGet(req,resp);
}
}
解决post请求中文乱码问题
@WebServlet("/req3")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理post方式中文字符乱码问题
req.setCharacterEncoding("UTF-8");
//获取单个值
String username = req.getParameter("username");
System.out.println(username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
Request请求转发
@WebServlet("/req4")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("req4...");
//存储共享数据
req.setAttribute("msg","hello");
req.getRequestDispatcher("/req5").forward(req,resp);
}
@WebServlet("/req5")
public class ServletDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("req5...");
//获取共享数据
Object msg = req.getAttribute("msg");
System.out.println(msg);
}
9、Response
Response重定向
浏览器向资源A请求数据时,资源A无法处理,向浏览器返回状态码302,并告诉浏览器去请求资源B,提供资源B的地址。
@WebServlet("/resp1")
public class ResponseDemo extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("resp1.....");
resp.sendRedirect("resp2");
}
}
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("resp2.....");
}
}
路径问题
Response响应字符数据
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置响应头及编码
resp.setContentType("text/html;charset=utf-8");
//获取字符输出流
PrintWriter writer = resp.getWriter();
writer.write("你好");
writer.write("<h1>你好</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
Respose响应字节数据
@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取文件输入流
FileInputStream fs = new FileInputStream("\\C:\\Users\\misGood\\Desktop\\图片\\1.jpg");
//2、获取字符输出流管道
ServletOutputStream os = resp.getOutputStream();
//3、复制文件对象到输出流管道
IOUtils.copy(fs,os);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}