JAVA Web
一、web相关的核心概念
1、软件的基本架构
cs(client server):qq、微信、原神
缺点:安装、硬件有要求、升级
bs(broswer server):京东、csdn、qq空间
优点:不安装、硬件无要求、不升级
2、tomcat
1)为什么要用tomcat?
broswer--->tomcat[servlet]--->jdbc--->mysql
2)tomcat是什么?
tomcat是apache和sun共同开发的一个免费开源的web应用服务器
3)tomcat的安装
官网:https://tomcat.apache.org/
安装:解压即安装
4)tomcat的目录结构

bin:脚本
-
startup.bat , shutdown.bat 用于在windows下启动和停止脚本;
-
startup.sh, shutdown.sh 用于在linux下启动和停止脚本;
conf:配置文件
-
logging.properties Tomcat 的日志配置文件, 可以通过该文件修改Tomcat 的日志级别及日志路径等
-
server.xml该文件用于配置server相关的信息,比如tomcat启动的端口号,配置主机(Host)。
lib:jar包
logs:日志
webapps:存放war包
work:???
5)启动和关闭
启动:双击bin/starup.bat
关闭:双击bin/shutdown.bat
测试:http://127.0.0.1:8080 或 http://localhost:8080 localhost本机地址和127.0.0.1等同
6)war包
WEB-INF
|-classes
|-lib
|-web.xml
index.jsp
war 包是 Sun 提出的一种 web 应用程序格式,它与 jar 类似是一个特殊的压缩包。
3、http协议

1) 请求行(Request Line):
url、请求方式、状态码
-
格式:
方法 URI 协议版本(如GET /index.html HTTP/1.1) -
包含HTTP方法(GET/POST等)、请求资源路径和HTTP协议版本
2) 请求头(Request Headers):
浏览器的信息、参数的格式
-
格式:键值对(如
Host: example.com) -
包含客户端环境信息、缓存策略、内容协商等元数据
-
常见字段:
-
Host:目标服务器域名
-
User-Agent:客户端信息
-
Accept:可接收的响应类型
-
Content-Type:请求体的数据格式
-
3) 请求体(Request body):
POST请求携带的参数
-
格式:
-
form-data:
name=value&age=20 -
JSON:
{"name":"value"} -
二进制数据(如图片上传)
-
-
包含POST/PUT等方法时携带的实际数据
4)响应头(Response Header):
服务器的信息、返回值的格式

5) 响应体(Response Body):
返回值
-
格式
-
网页请求:HTML代码
-
API请求:JSON/XML格式数据
-
文件下载:二进制流(如图片、PDF)
-
-
包含服务器返回的实际数据,如HTML页面、JSON或二进制文件
二、servlet入门
1、什么是servlet?
servlet(server applet)是Java语言编写的运行在tomcat上的程序
servelt提供了一个接口(servlet),该接口规定了tomcat和servlet实例的契约,即所有servlet实例都必须直接或间接实现该接口
2、创建web工程
2.1创建maven工程

2.2添加webapp项目
2.2.1右击项目,选择Add Frameworks Support

2.2.2选择Web Application,再点击OK

2.3将web目录拖拽到main目录下,并改名为webapp

-
webapp:静态资源比如 html css js jsp可以定义在web下面
-
WEB-INF:里面的资源不能直接被外界访问 web.xml 是web项目的核心配置文件
-
index.jsp:web项目的访问首页,在默认情况我们访问的首页就是index.jsp
2.3.添加依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
2.4.创建servlet实例
package com.hg.servlet;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest req, ServletResponse servletResponse)
throws ServletException, IOException {
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().write("<h1>hello<h1>");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
2.5.配置servlet
-
web.xml中配置
<!--
配置Servlet
servlet-name:servlet的名称
servlet-class:servlet的全类名
url-pattern: 访问servlet的url
-->
<servlet>
<servlet-name>hello</servlet-name>
<!-- servlet-name要和servlet-mapping所对应,映射的关系-->
<servlet-class>com.hg.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.6.设置打包方式
-
修改pom.xml
<!--打包方式-->
<packaging>war</packaging>
注意:先添加webapp目录,再设置打包方式
2.7.部署web项目
7.1点击“Edit Configurations”

7.2点击"+"

7.3点击Tomcat Server中的Local
7.4配置Tomcat路径
7.5部署web项目

7.6启动tomcat

7.7查看是否部署成功

7.8测试
浏览器访问:http://localhost:8080/01_servlet_HelloWorld_war/hello
3、创建servlet实例
①pom.xml
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
②servlet
public class HelloServlet implements Servlet {
......
}
③web.xml
<servlet>
<servet-name>helloServlet</servlet-name>
<servlet-class>com.hg.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servet-name>helloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
4、servlet的声明周期
构造方法:第一次请求,tomcat通过反射创建servlet时调用,只调用一次
init():servlet实例创建之后调用,只调用一次
service():每次请求都调用
destroy():关闭tomcat时调用
三、servlet的三种创建方式
1、实现servlet接口
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/test1")
public class Servlet1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
//s使用ServletConfig对象初始化我们的Servlet
//执行了,从这个地方可以说明一个问题 Servlet已经被实例化了
System.out.println("init方法执行");
}
@Override
public ServletConfig getServletConfig() {
//获取servlet配置信息对象
//没有执行
System.out.println("getServletConfig方法执行");
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//解决中文乱码问题
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("我是Servlet接口创建的Servlet");
}
@Override
public String getServletInfo() {
//获取Servlet的详细信息
//没有执行
System.out.println("getServletInfo方法执行");
return null;
}
@Override
public void destroy() {
//当tomcat关闭的时候,执行销毁这个servlet的方法
System.out.println("destroy方法执行");
//只有当tomcat关闭的时候,才会执行这个方法
}
}
缺点:必须实现所有方法
2、继承GenericServlet抽象类
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/*
* 第二种方式:继承GenericServlet
*
* */
@WebServlet("/test2")
public class Servlet2 extends GenericServlet {
//只有一个方法是必须重写的,抽象方法
//为什么?service是核心方法,因为请求和响应就是执行这个方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//解决中文乱码问题
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("我是GenericServlet抽象类创建的Servlet");
}
}
优点:无须实现所有方法
3、继承HttpServlet抽象类
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/test3")
public class Servlet3 extends HttpServlet {
//因为在前端的时候,有两种请求方式get和post
//doGet和doPost方法写在了Service方法中了
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("我是HttpServlet创建的Servlet");
}
}
优点:①把请求分门别类 ②强化request和response
建议:使用HttpServlet方法最好
四、接收前台提交的参数
request.getParameter("get请求时参数的key|post请求时input标签的name属性")
-
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <form action="login" method="post"> <input type="text" name="username"/><br> <input type="text" name="password"/><br> <input type="submit" value="提交"> </form> </body> </html> -
servlet实例
public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-8"); //html页面中 input标签发送的数据,都会存到HttpServlet这个对象里面 //通过前端input标签name的属性值获取前端发送的数据 String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println("username: " + username+"===password"+password); //Servlet响应数据到客户端的时候,如果是中文的话,会乱码 response.setContentType("text/html;charset=utf-8"); response.getWriter().write("username: " + username+"===password"+password); } } -
web.xml
<servlet> <servlet-name>login</servlet-name> <servlet-class>com.hg.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>login</servlet-name> <url-pattern>/login</url-pattern> </servlet-mapping>五、中文乱码的解决方案
-
请求时候的乱码问题:
post:request.setCharacterEncoding("UTF-8");
get:new String(str.getByte(), "UTF-8");
响应时候中文乱码的问题:
response.setContentType("text/html;charset=utf-8");
六、请求转发和重定向(了解)
请求转发:
本质:servlet的内部行为(servlet1------------>servlet2)
特点:
一次请求
request不变,属性不丢失
request.getRequestDispatcher(“main.jsp”).forward(request,response);
//这一行代码就表示进行了转发,url没有变,但是响应的结果却是一次请求干了两个活
重定向
本质:浏览器发送两次请求(status:302 Location:target.jsp)
特点:
两次请求
创建新的request,属性丢失
response.sendRedirect("main.jsp"); //就这一行代码,但是这一行代码必须写在doGet或者doPost方法中
七、servlet的自动加载(了解)
<servlet>
<servlet-name>loadOnStartupServlet</servlet-name>
<servlet-class>com.hg.servlet.LoadOnStartupServlet</servlet-class>
<!--tomcat启动时就创建该servlet实例,数字越小优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
八、三大作用域(重点)
| 作用域 | 范围 | 失效 |
| request(请求域) | 一次请求 | 响应时失效 |
| session(会话域) | 浏览器(跨request) | 浏览器关闭 或 session失效 |
| servletContext(应用域) | 整个web应用(跨session) | 关闭tomact |
九、cookie和session
1、cookie
1)是什么?
是保存在浏览器中的一块存储区域
2)特点
①以键值对方式保存
②可设置失效时间
③可禁用
④最多存4096byte
常用方法
//1.cookie的构造方法,目的是实例化出来cookie对象
Cookie(String name,String value)
//2.设置cookie的方法
setValue(String value) //修改cookie的值
getValue(String value) //获得cookie的值
getName(String value) //获得cookie的键
setMaxAge(int time) //设置cookie的有效时间
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);
//4.获得所有cookie
request.getCookies();
2、session
1)是什么?
是保存在tomact中的一块存储区域
2)特点
①键值对
②可设置失效时间
常用方法
request.getSession(); //返回HttpSession
setAttribute(key,value); //设置属性 key ,value
getAttribute(key); //获取key的值
removeAttribute(String key) //通过key值删除数据
invalidate(); //将session中的变量全部清空
setMaxInactiveInterval(int interval); //设置session失效时间,单位为秒
getMaxInactiveInterval();//获取session失效时间
getId(); //获取sessionID
十、配置对象(了解)
1、servletConfig对象
1)是什么?
是servlet的一个配置对象,由tomcat创建并通过init()方法传给servlet,可通过getServletConfig()获得该对象
2)怎么用?
①配置参数
<servlet>
<servlet-name>servletConfigServlet</servlet-name>
<servlet-class>com.hg.servlet.ServletConfigServlet</servlet-class>
<!--给ServletConfigServlet配置参数-->
<init-param>
<param-name>msg</param-name>
<param-value>fuck you!!!</param-value>
</init-param>
</servlet>
②获取参数
ServletConfig servletConfig = getServletConfig();
servletConfig.getInitParameter("msg");
2、servletContext对象
1)是什么?
是整个web应用的一个配置对象,由tomcat创建,可通过getServletContext()获得该对象
2)怎么用?
①配置参数
<context-param>
<param-name>msg</param-name>
<param-value>fuck tony!!!</param-value>
</context-param>
②获取参数
ServletContext servletContext = getServletContext();
servletContext.getInitParameter("msg");
十一、过滤器Filter(重点)
执行器执行流程

1、是什么?
filter(过滤器):是一个特殊的servlet,能过滤所有请求
2、在哪用?
设置编码格式
登录校验
记录日志
3、怎么用?
①创建filter
public class LogFilter implements Filter {
... ...
}
②配置filter
<filter>
<filter-name>logFilter</filter-name>
<filter-class>com.hg.servlet.LogFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>logFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
十二、监听器(了解)
1.是什么
监听器是监听servletContext、session的创建和销毁、以及其属性添加、删除的组件
2.怎么用
①创建filter
public class MyListener implements HttpSessionListener,ServletContextListener {
... ...
}
②配置filter
<listener>
<listener-class>com.hg.servlet.MyListener</listener-class>
</listener>
十三、三层架构

1.好处
规范代码,各司其职
2.什么是三层架构
web层:控制层
com.hg.servlet/web/controller servlet包,作用:接受请求、调用service、控制跳转
service层:业务层
com.hg.service service接口包
com.hg.service.impl service实现类包,作用:业务
dao层:数据访问层
com.hg.dao dao接口包
com.hg.dao.impl dao实现类包,作用:访问数据
3.三层架构的调用关系
web--------------->service-------------------->dao
原则:
1、一次只写一层
2、复杂的业务先写注释
常见错误:
一、404错误
原因:请求的URL路径与服务器路由不匹配,或资源(如HTML/JS/CSS文件)未正确部署。
即未配置web.xml
二、405错误
原因:使用的HTTP方法(如GET、POST、PUT等)不被服务器支持或禁止用于目标资源
get方法和post方法不对应
三、500错误
原因:表现层未正确处理业务逻辑层返回的异常,直接抛出未捕获的错误。
更多推荐

所有评论(0)