WebServer
WEB基础
WEB-INF目录
- 所处位置:Deployed Resources\WEB-INF
- 作用:WEB-INF目录在服务器端不可见
web.xml
- 查询原理:类似于外键,用于通过多个url查找同一个servlet;
- 继承自tomcat下的web.xml,若url设置为\代表不能用
- <url-pattern>
- 值必须以\开头否则服务器启动不了.
- 值不能出现错误,否则访问404.
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>web.HelloServlet</servlet-class> //要写Servlet完整的包名.类名
<init-param>
<param-name>encode</param-nam>
<param-value>utf-8<param-name>
</param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name> //须和servlet标签中的配置的名字完全一致
<url-pattern>/hello</url-pattern>
</servlet-mapping>
应答状态码
状态码 | 内容 |
---|---|
200 | 正常 |
302 | 重定向 |
304/307 | 使用浏览器缓存 |
404 | 资源未找到 |
405 | 服务器不支持当前使用的请求方式 |
500 | 服务器生成响应内容出现异常(代码问题) |
-
404出现的原因
- web.xml中没有配置servlet
- web.sml中配置的url-pattern标签书写错误
- 浏览器路径书写错误
-
405
继承了HTTPServlet方法,但是书写错取,没有重写service()方法
请求转发和重定向的区别
-
图片
-
请求转发
[外链图片转存失败(img-6nI0a6ja-1563684415919)(imgs/请求转发.jpg)]
-
重定向
[外链图片转存失败(img-HdLW8Dfh-1563684415944)(imgs/重定向.jpg)]
-
-
使用状况
- 请求转发:传输数据
- 重定向:定义到别的网站
SERVLET
新建servlet
-
实现Servlet类右击报错,生成需要重写的方法 -
继承HTTPServlet类
重写service方法/或者doget()和dopost();
右击—source–Override/Inplements—service(HttpServletRequest,);
发送代码
发送:reponse;
接收:request;
printWriter pw = response.getWriter();
pw.writer();
获取信息
- 提交type(radio/select/)没有输入内容,不提交,java显示为null;
- 提交内容(text/password/…)没有输入内容,传入空字符串https://v.qq.com/x/page/j00206dai30.html
String name = request.getPrarmeter("name");
表单乱码
-
POST乱码
建议写在最前面(写在printWriter pw = response.getWriter());
request.setCharacterEncoding("utf-8");
-
GET乱码
修改Tomcat7中的conf中的server.xml(Tomcat8及以上不支持)
添加URIEncoding=“UTF-8”(区分大小写)
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
响应乱码
-
tomcat(不需要写,浏览器包括这个作用)response.setCharacterEncoding("utf-8");
-
浏览器
response.setContentType("text/html;chartset=utf-8");
重定向
相当于将页面重新发送给用户
response.sendRedirect(url);
DOA
servlet生命周期
1.实例化—初始化—就绪—销毁
- 默认第一次访问时实例化并初始化
- 配置下列代码的,在启动时就实例化并初始化
- 启动多个文件时,就会启动多个service();
<load-on-startup>0</load-on-startup>//在servlet中定义
init()//运行前执行的代码
destroy()//关闭前执行的代码S
- 2.Httpservlet
- do get()如果是get请求的话会被执行
- do post()如果是post请求的话会被执行
- 或者直接重写service方法
3.ServletConfig
-
用于读取web.xml中的内容
ServletConfig config = getServletConfig(); String value = config.getInitParmeter("encode");
-
xml的书写方式
<init-param> <param-name>man</param-name> <param-value>20,25</param-value> </init-param
JSP
基础知识
-
解析过程:
jsp翻译成java文件,java文件编译成class文件,class会被解析成html文件
只解析一次,服务器会保留java和class文件.
JSP代码
-
java表达式
<%=java表达式 %>
-
JSP脚本片段
<% JSP片段 %>
JSP指令
-
代码
<%@指令名 属性1="值1" [属性2="值2"] %>
-
这里只学习page指令
page指令用于指导浏览器的操作
-
import属性
指定翻译后的类因该导入java包
<%@page import="包名1[,包名2]" %>
-
pageEncoding属性
1.规定保存jsp文件的编解码规则;
2.为java文加添加:response.setContentType(“text/html;charset=UTF-8”);
请求转发
用户获取自己定义的数据
-
存
request.setAttribute("名称","信息");
-
获取一个请求转发器
RequestDispatcher rd = request.getRequestDispatcher(url);
-
转发请求
rd.forward(request,response);
-
取
request.getAttribute("名称");//返回object类型要进行强制类型转换
Cookie
-
创建cookie
-
创建cookie
Cookie cookie = new Cookie("Cookie名称",数值);
-
设置生效时间
cookie.setMaxAge(时间);//以秒为单位
-
设置域名
cookie.setDomain("域名");
-
设置路径
cookie.setPath("路径");//默认不写是servlet父路径,path>=url
-
发送cookie
response.addCookie("cookie名称");
-
字符集(编码规则)
String value = URLEncoder.encode("数值","UTF-8");//相当与发送时输入了编码
-
获取当前文件的父路径
request.getContextPath();
-
-
接收cookie
-
获得cookie
Cookie[] cs = request.getCookies();
-
字符集(解码规则)
String name = URLDecoder.decode("数值","UTF-8");
-
获得数据
String name = cs[0].getName(); String value = cs[0].getValue();
-
Session
-
流程(服务器):
1.获取用户所有cookie
2.查询是否有名session_id的cookie
3.没有就创建,有查找session对象
-
创建
不写相当于true
HttpSession session = request.getSession(true);//有则使用,无则创建 HttpSession session = request.getSession(false);//有则使用,无则返回nulll
-
绑定数据
session.setAttribute("名称","信息");
-
获取数据
Object x = session.getAttribute("名称");//返回Object类型
-
获取session_idsession.getId();
-
销毁
-
自动销毁
修改web.xml文件
<session-config> <session-timeout>15</session-timeout> </session-config>
-
手动销毁
session.invalldate();
-
过滤器(Filter)
-
创建步骤
1.开发一个filter类,实现filter类
2.ctrl+1生成doFilter/init/destroy方法
3.修改web.xml:创建过滤规则
<filter> <filter-name>DemoFilter</filter-name> <filter-class>filter.DemoFilter</filter-class> </filter> <filter> <filter-name>DemoFilter2</filter-name> <filter-class>filter.DemoFilter2</filter-class> </filter> <filter-mapping> <filter-name>DemoFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>DemoFilter2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
通过过滤器
在doFilter()中设置
chain.doFilter(request,response);
-
多个过滤器同时生效时
按照filter-mapping标签的书写顺序进行过滤
-
生命周期
- 实例化:加载并实例化web.xml中所有过滤器
- 初始化:调用init();
- 就绪:用户请求的url和当前Filter匹配时,自动调用doFilter();
- 销毁:调用destory()方法;并在结束时。
-
fConfig方法
-
获取web.xml配置信息
fConfig.getInitParameter("名称");
-
输出fiter-name
Enumeration<String> it = fConfig.getInitParameterNames(); while(it.hasMoreElements()) { it.nextElement(); }
-
ServletContext
共享数据,在服务器启动时就会启动
-
获取ServletContext对象
一个servlet中的是相同的对象
ServletContext sc = getServletContext(); ServletContext sc = request.getServletContext();
-
绑定数据
sc.setAttribute("名称", object数据);
-
共享配置数据
-
xml
<context-param> <param-name>encode</param-name> <param-value>UTF-8</param-value> </context-param>
-
代码
sc.getInitParameter("名称");
-
-
获取文件在服务器上的绝对路径
sc.getRealPath("文件名");
监听器(listener)
-
可监听的
-
特殊事件的创建和销毁
1.request
2.session
3.servletContext
-
特殊对象中绑定/更新/删除数据
-
-
创建步骤
1.实现(对应接口)
ServletContextListener/创建
HttpSessionAttributeListener/添加/修改/删除
2.ctrl+1创建方法
3…配置web.xml文件
<listener> <listener-class>listener.MyServletContextListener</listener-class> </listener>
JSTL
-
El表达式
- 语法:${}
- 四大作用域:pageContext/request/session/servletContext
- param.username;
- 数组和集合:不能进行遍历
- 可在监听器的init上创建内容,用于获取
- 支持算数运算/逻辑运算/
-
配置自定义标签
1.下载JSTLmaven包
-
语法1:
2.<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core”%>
-
if判断
scope=page/request/session/application
pageContext.setAttribute(“flag","flase”);//默认page <c:if test="${day==3}" var="flag" scope="page"> test==true输出 </c:if> <c:if test="${!flag}" 相当于else </c:if>
-
switch
<c:choose> <c:when test="${day==1}"> Hello Tuesday; </c:when> <c:when test="${day==2}"> Hello Tuesday; </c:when> <c:otherwise> Hello JSTL; </c:otherwise> </c:choose>
-
for循环
for(i=1;i<10;i+=2){} <c:forEach begin="1" end="10" step="2" var="i" [carSatus="st"]> ${i} [st.count//次数 st.index st.first//是否为第一个 st.last//是否为最后一个] </c:forEach>
-
增强for循环
<c:forEach items="${list} var="user"></c:forEach>
-
-
语法2:
2.<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt”%>
-
格式化数字
<fmt:formatNumber pattern="RMB###,###,###.00" value="${price}" />
-
格式化日期
<fmt:formatDate value="${today}" pattern="yyyy/MM/dd" />
-
九大内置对象和四大作用域
对象 | 域 | 类 | |
---|---|---|---|
application | application | ServletContext | |
config | page | ServletConfig | |
exception | page | Throw(错误页面) | |
out | page | JSPWrite | |
page | page | Servlet(this) | |
pageContext | page | PageContext | |
request | request | HttpServletRequest | |
response | response | HttpServletResponse | |
session | session | HttpSession |
java官方标签
-
jsp标签
<jsp:useBean id="名称" class="导入包"></jsp:useBean>
-
fmt标签
<fmt:formatDate value="${today}" pattern="yyyy/MM/dd" />
url-parren
-
/user/listUser 一对一
-
/user/* 一对多
-
*.后缀 比如 *.do, list.do
-
匹配的优先级
Servlet1 : url-pattern /*
Servlet2 : url-pattern /user/listUser.do
Servlet3 : url-pattern .do
Servlet4 : url-pattern /user/请求1: /user/listUser.do ->第二个
请求2: /user/addUser.do ->第四个原则:
- 谁最像找谁
- *.后缀 的 优先级 永远是最低的
*.do
/user/listUser.do
MVC
注解
-
创建annotation文件–选择Runtime+Method
-
Retention(RUNTIME)
指明当前解释保存到那个阶段
1.SOURCE:.java
2.CLASS:.java—.class
3.RUNTIME:.java—.class—类加载
-
Target(METHOD)
指明当前解释添加到那些位置
METHOD:添加到方法上
-
详细
@RequestMapping("地址"); request.getRequestURI();
反射
- 作用:动态查看一个类的所有成员(方法,属性);
- 代码:
-
获取class对象
- 已知包类名获取类名
Class forName = Class.forName(className);//className是String类型
- 已知对象获取类名
创建一个静态类,参数为Object obj
Class cz = obj.getClass();
-
获取该类声明的所有属性
```java Field[] fs = cz.getDeclaredFields(); ```
-
获取该类声明的所有方法
Method[] ms = cz.getDeclaredMethods();
-
获取该方法上所有的注解
Annotation[] ans = method.getAnnotations();
-
动态的创建该类的对象
Object obj = cz.newInstance();
-
其他
Method method = cz.getDeclaredMethod("listUser");
-
执行方法
```java Object result = method.invoke(obj[,参数1,参数2]); ```
-
获取某类型的注解
RequestMapping an = method.getAnnotation(RequestMapping.class);
JDBC
mvavn包
mysql-connector-java
commons-dbcp
连接数据库
-
mysqlshow processlist;//检查当前链接数
-
加载的是java.sql
-
加载驱动:Class.forName ("com.mysql.jdbc.Driver");//1.6之后会自动添加|java web不会添加
-
获取连接:Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/库名",用户名,密码);
连接池
- 作用:将连接重用,避免浪费,提高执行效率
- 在maven中添加dbcp
- 安装maven包dbcp/mysql-connector
- 保证只有一个连接池,但是可以连接所个数据
-
创建连接池对象:
BasicDataSource dataSource = new BasicDataSource();
-
设置连接池信息:
dataSource.setDriverClassName("com.mysql.jdbc.driver"); dataSource.serUrl("jdbc:mysql://localhost:3306/数据库名"); dataSource.setInitialSize(3);//初始连接数量 dataSource.setMaxActive(5);//最大连接数量
-
获取连接
Connection coon = dataSource.getConnection();
-
释放资源
coon.close();
执行sql语句
-
创建sql执行对象:
Statement stat = conn.createStatement();//创建执行语句,并返回结果
-
执行sql语句
- 创建
Boolean x = stat.execute(sql语句);
- 增删改
int x = stat.excuteUpdate(sql语句);
- 查询
ResultSet rs = stat.executeQuery(sql语句); while(rs.next()) { String name = rs.getString("ename"); double sal = rs.getDouble("sal"); System.out.println(name+":"+sal); }
-
批量执行(不适用与查询)
1.创建sql语句 sq1/sq2/sq3 2.stat.addBatch(sq1);stat.addBatch(sq2); 3.stat.excuteBatch();
预编译执行sql语句
好处:用于便捷的书写变量的sql值,防止sql注入;
sal注入:=’ ’ or ‘1’=’
1.创建sql语句
String str = "insert into jdbcperson value (null,?,?)";
2.创建预编译的SQL执行对象:
PreparedStatement ps = conn.PerparedStatement(sql);
3.把?换成真正的对象:
ps.setString(1,变量名);
4.执行sql语句
-
单句执行:
ps.executeUpdate();
-
批量执行:
ps.addBatch(); ps.excuteBatch();
查询获取得到的字段值
int | getInt() |
---|---|
varchar | getString() |
float/double | getFLoat()/getDouble() |
datetime/timestamp | getDate() |
括号内书写字段名,或者字段名的位置(相对于查询语句处的*位置)
事务
1.关闭事务自动提交
conn.setAutoCommit(flase);
2.提交事务
conn.commit();
3.回归事务
conn.rollback();
获取自增字段
String sql1 = "insert into team values(null,?)";
PreparedStatement ps = conn.prepareStatement(sql1,Statement.RETURN_GENERATED_KEYS);
ps.setString(1,teamName);
ps.executeUpdate()
ResultSet rs = ps.getGeneratedKeys();;//获取自增的主键值
while(rs.next()) {
teamId = rs.getInt(1);
}
文本获取
1.引入文本:
InputStream ips = java文件名.class.getClassLoader().getResourceAsStream("jdbc.properties");
2.创建properties对象:
Properties prop = new Properties();
3.引用文本:
prop.load(ips);