文章目录
JavaWeb基础知识
结构图:
基础准备
Tomcat:
- 启动:在bin文件夹中打开startup.bat
- 关闭:shutdown.bat
- 使用:在网站窗口输入
localhost:8080
就会出现这个,这个是可以修改的,数字可以改,在System中的host可以改localhost的名字 - 访问路径:localhost访问的是webapps里面的ROOT文件夹
- 发布网站: 将自己写的网站放到服务器(tomcat)指定的web应用的文件夹下,就可以访问了
网站是如何访问的:
- 输入域名:回车
- 检查本机路径下C:\Windows\System32\drivers\etc\host有没有域名映射
- 有的话就直接返回对应的IP地址,可以直接访问;没有的话就在DNS中查找,找到就返回
网站应有结构:
webapps:
- ROOT
- kiruto:网站的目录名
- WEB-INF
+ classes:java程序
+ lib:web应用依赖的jar包
+ web.xml:网站配置文件 - index.html:默认的首页
HTTP
请求行:
- 请求行中的请求方式:GET
- 请求方式:Get,Post,HEAD等
- get:请求能携带的参数比较少,有大小限制,会在浏览器的URL地址栏显示数据内容,不安全但高效
- post:请求能携带的参数比较多,没有大小限制,不会显示参数,安全但低效。
消息头:
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
响应体:
这个不知道有啥用
Accept: 告诉浏览器支持的数据类型
Accept-Encoding:支持那种格式编码 GBK、UTF-8、GB2312等
Cache-Control: 缓存控制
Connection:告诉浏览器,请求完成时断开还是保持连接
HOST: 主机
Refresh:告诉客户端,多久刷新一次
Location:让网页重新定位
响应状态码:
- 200:请求响应成功
- 3xx:请求重定向,重定向就是转到新给的位置中
- 4xx:找不到资源
- 5xx:500是服务器diamagnetic逻辑错误,502是网关错误
动态Web:
创建Maven配置Tomcat:
Servlet
基本结构与功能
功能:连接业务层和前端,从前端接受参数传递给业务层。
结构:servlet.java
文件用来写逻辑传参数,web.xml
用来注册访问路径。
原理:
继承关系:
public abstract class HttpServlet extends GenericServlet {
}
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
}
servlet实现:
public class HelloServlet extends HttpServlet {
// get和pose只是请求实现的不同方式,可以相互调用,业务逻辑都一样
// 参数:请求、响应,然后还要抛异常
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 响应
System.out.println("进入了doget");
PrintWriter writer = resp.getWriter();
writer.print("hello servlet");
}
}
web注册:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
<!--最新版的头-->
<!--注册servlet-->
<servlet>
<!--这个是自己起名,map的时候用到-->
<servlet-name>hello</servlet-name>
<servlet-class>com.it.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet的请求路径-->
<servlet-mapping>
<!--路径被请求时调用的映射-->
<servlet-name>hello</servlet-name>
<!--输入该路径来映射-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
遇到的问题:
配置tomcat的时候需要artificial,没有可以自己创建一个,在Project Structure–>Project Settings–>Artifacts–>添加Web Application:Archive,Output directory选择servlet-01\target,Output Layout选择servlet-01.war
Mapping
路径映射有三种方法:
- 一个请求可以指定一个映射路径
<!--servlet的请求路径-->
<servlet-mapping>
<!--路径被请求时调用的映射-->
<servlet-name>hello</servlet-name>
<!--输入该路径来映射-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
- 可以指定多个映射路径
<!--servlet的请求路径-->
<servlet-mapping>
<!--路径被请求时调用的映射-->
<servlet-name>hello</servlet-name>
<!--输入该路径来映射-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
- 使用通配符
可以写任意也可以不写,通配符的优先级是较低的,指定的固有的路径优先级最高。
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
这样是不行的
<url-pattern>/*.do</url-pattern>
要把/去掉才可以自定义后缀,*前面什么都不能加
<url-pattern>*.do</url-pattern>
优先级:指定固有路径的最高
ServletContext
功能:
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,代表了当前的web应用。
就相当于全局变量,或者说是单例模式,每个实例获取的ServletContext都是一样的。
共享数据:
分为添加与获取两部分:
// 添加
public class HelloServlet extends HttpServlet {
// get和pose只是请求实现的不同方式,可以相互调用,业务逻辑都一样
// 参数:请求、响应,然后还要抛异常
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取
ServletContext servletContext = this.getServletContext();
// 添加全局属性
servletContext.setAttribute("username", "张三");
}
}
// 获取
public class getContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取ServletContext元素
ServletContext servletContext = this.getServletContext();
Object username = servletContext.getAttribute("username");
// 设置格式
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
// 网页打印
PrintWriter writer = resp.getWriter();
writer.print("名字" + username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.it.servlet.getContext</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
获取初始化参数:
<!--配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
请求转发:
感觉后来的都是直接用req
来转发?
public class doDispatch extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp