HyperText Transfer Protocol,超文本传输协议,规定浏览器与服务器之间数据传输的规则
http协议特点
1.请求行:请求数据的第一行。其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本
2.请求头:第二行开始,格式为key:value形式
3.请求体:POST请求的最后一部分,存放请求参数
常见的HTTP请求头
Host:请求的主机名
User-Agent:浏览器版本,如谷歌浏览器的标识类似Mozilla/5.0...
Accept:表示浏览器能接收的资源类型
Accept-Language:表示浏览器偏好的语言
Accept-Encoding:表示浏览器可以支持的压缩类型,例如gzip,deflate等
1.响应行:响应数据的第一行。由协议版本,响应状态码,状态码描述组成
2.响应头:第二行开始,格式为key:value形式
3.响应体:最后一部分。存放响应数据
常见响应头
Content-Type:表示该响应内容的类型
Content-Length:表示响应内容的长度
Content-Encoding:表示该响应压缩算法
Cache-Control:指示客户端应如何缓存
响应状态码中:200代表客户端请求成功,404代表资源找不到,一般是URL输入有误,500服务器发生不可预期的错误,服务器异常
Web服务器是一个应用程序软件,对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷
创建项目两种方式:使用骨架,不使用骨架
Web项目结构:
Maven Web项目结构:开发中的项目
项目名称
src 主目录
main
java java代码
resources 资源文件,配置文件
webapp Web项目特有目录
html HTML文件目录
WEB-INF Web项目核心目录
web.xml Web项目配置文件
test 测试目录
java
resources
pom.xml
部署的JavaWeb项目结构:开发完成,可以部署的项目
项目名称 项目访问路径
html HTML文件目录
WEB-INF Web项目核心目录
web.xml Web项目配置文件
classes Java字节码文件
lib 项目所需jar包
编译后的Java字节码文件和resources的资源文件,放到WEB-INF下的classes目录下
pom.xml中依赖坐标对应的jar包,放入WEB-INF下的lib目录下
是JavaEE的一个规范,体现出来就是一个接口
Servlet是Java提供的一门动态web资源开发技术
1.创建web项目,导入Servlet依赖坐标
javax.servlet
javax.servlet-api
3.1.0
provided
2.创建:定义一个类,实现Servlet接口,并重写接口中所有方法
3.配置:在类上使用@WebServlet注解,配置该Servlet的访问路径
4.访问:启动Tomcat,浏览器输入URL访问该Servlet
例:localhost/虚拟目录/资源路径
tomcat接收请求,解析请求路径,找到具体访问项目,再找到要访问的资源,tomcat就会创建对应的servlet实现类对象,并且调用service方法
init():tomcat创建Servlet实现类对象的时候会自动调用该方法
1.默认是第一次访问该动态资源时,可以通过loadOnStartup属性进行修改,如果值是正整数就是在服务器启动的时候创建Servlet实现类对象
2.@WebServlet(value="动态资源路径",loadOnStartup=1)
service():每一次请求该资源都会执行
destory():销毁servlet时。
初始化方法,在Servlet被创建时执行,只执行一次
public void init(ServletConfig servletConfig)
获取ServletConfig对象
public ServletConfig getServletConfig()
提供服务的方法,每次Servlet别访问,都会调用该方法
public void service(ServletRequest servletRequest, ServletResponse servletResponse)
获取Servlet信息
public String getServletInfo()
销毁方法,当Servlet被销毁时,调用该方法。在内存释放或服务器关闭时销毁Servlet
public void destroy()
Interface Servlet Servlet体系的根接口
Class GenericServlet 抽象实现类
Class HttpServlet 对Http协议封装的Servlet实现类
HttpServlet使用步骤
1.继承HttpServlet
2.重写doGet和doPost方法
原理:获取请求方式,并根据不同的请求方式调用不同的doXxx方法
1.一个Servlet,可以配置多个urlPattern
@WebServlet(urlPatterns={"/demo1","/demo2"})
2.urlPattern配置规则
1.精确匹配 精确的路径,/ 开头
2.目录匹配 / 开头 *结尾
3.扩展名匹配 * 开头,后面跟上 .后缀名,如 *.do
4.任意匹配 @WebServlet("/") @WebServlet("/*")
demo1
com.itheima.web.ServletDemo1
demo1
/demo1
ServletRequest Java提供的请求对象根接口
HttpServletRequest Java提供的对Http协议封装的请求对象接口
RequestFacade Tomcat定义的实现类
String getMethod():获取请求方式
String getContextPath():获取虚拟目录
StringBuffer getRequestURL():获取URL(统一资源定位符)
String getRequestUPI():获取URI(统一资源标识符)
String getQueryString():获取请求参数(GET方式)
String getHeader(String name):根据请求头名称,获取值(如:User-Agent)
ServletInputStream getInputStream():获取字节流
BufferedReader getReader():获取字符输入流
Map getParameterMap():获取所有参数Map集合
String[] getParameterValues(String name):根据名称获取参数值(数组)
String getParameter(String name):根据名称获取参数值(单个值)
1.POST请求的解决方式
request.setCharacterEncoding("UTF-8") 设置字符输入流的编码
2.GET请求的解决方式
乱码原因:
浏览器使用设置的UTF-8对数据进行URL编码,发送到Tomcat,默认ISO-8859-1进行URL解码,所以出现乱码
//URL编码
String encode=URLEncoder.encode("哈哈","UTF-8");
//URL解码
String decode=URLDecode.decode(encode,"UTF-8");
//解决方案1
username=new String(username.getBytes(StandardCharsets.ISO_8859_1),StandardCharsets.UTF_8)
//解决方案2,在pom.xml文件tomcat中配置uriEncoding
org.apache.tomcat.maven
tomcat7-maven-plugin
2.2
80
/web-demo
UTF-8
实现:
request.getRequestDispatcher("/资源路径").forward(request,response);
request用于共享数据的方法:
setAttribute(String name,Object value)
Object getAttribute(String name)
removeAttribute(String name)
请求转发的特点
1.浏览器地址栏不发生变化‘
2.只能转发到当前服务器的内部资源
3.一次请求,可以在转发的资源间使用request共享数据
ServletResponse Java提供的响应对象根接口
HttpServletResponse Java提供的HTTP协议封装的响应对象
ResponseFacade Tomcat定义的实现类
void setStatus(int sc):设置响应状态码
void setHeader(String name,String value):设置响应头键值对
PrintWriter getWriter():获取字符输出流
ServletOutputStream getOutputStream():获取字节输出流
1.设置响应状态码302
2.响应头 location:xxx
resp.setStatus(302);
resp.setHeader("location","资源b的路径");
简化实现方式
resp.sendRedirect("资源b的路径");
浏览器使用:需要加虚拟目录
服务端使用:不需要加虚拟目录
response.setContenType("text/html;charset=utf-8");
//1.获取字符输出流
PrintWriter writer=response.getWriter();
//2.设置响应头信息(内容类型)
response.setHeader("content-type","text/html");
//3.写入数据
writer.writer("hahaha");
注意:
该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
中文数据乱码:原因通过Response获取的字符输出流编码:ISO-8859-1
resp.setContentType("text/html;charset=utf-8");
1.通过Response对象获取字节输出流
ServletOutputStream outputStream=resp.getOutputStream();
2.写数据
outputStream.write(字节数据);
1.导入坐标
commons-io
commons-io
2.6
2.使用
IOUtils.copy(输入流,输出流);
1.导入JSP坐标
javax.servlet.jsp
jsp-api
2.2
provided
2.创建JSP文件
3.编写HTML标签和Java代码
JSP本质上就是一个Servlet
浏览器发送请求到tomcat,tomcat将jsp文件自动转换成java文件(Servlet),再由tomcat编译为字节码文件,向浏览器发送响应
1.<%...%>:内容会直接放到_jspServlet()方法中
2.<%=...%>:内容会放到out.print()中,作为out.print的参数
3.<%!...%>:内容会放到_jspService()方法之外,被类直接包含
Servlet-->JSP-->Servlet+JSP-->Servlet+html+ajax
不要直接在JSP里写Java代码
Servlet:逻辑处理,封装数据
JSP:获取数据,遍历展现数据
//例:
List<Brand> brands = new ArrayList<Brand>();
brands.add(new Brand(1,"三只松鼠","三只松鼠",100,"三只松鼠,好吃不上火",1));
brands.add(new Brand(2,"优衣库","优衣库",200,"优衣库,服适人生",0));
brands.add(new Brand(3,"小米","小米科技有限公司",1000,"为发烧而生",1));
//存储到req域中
req.setAttribute("brands",brands);
//请求转发
req.getRequestDispatcher("/brandjsp.jsp").forward(req,resp);
JSP文件中获取数据
${brands}
JavaWeb中的四大域对象:
1.page:当前页面有效
2.request:当前请求有效
3.session:当前会话有效
4.application:当前应用有效
el表达式获取数据,会依次从这4个域中寻找,直到找到为止
1.导入坐标
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
2.在JSP页面上引入JSTL标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
标签前缀 标签库位置
3.使用
男
MVC是一种分层开发的模式,其中:
MVC好处
编写案例步骤
1.创建新的模块,引入需要的坐标
2.创建三层架构的包结构
3.数据库表
4.实体类
5.Mybatis基础环境:mybatis-config.xml XxxMapper.xml XxxMapper接口
发送Cookie对象
1.创建Cookie对象,设置数据
Cookie cookie=new Cookie("key","value");
2.发送Cookie到客户端:使用response对象
response.addCookie(cookie);
获取Cookie对象
1.获取客户端携带的所有Cookie,使用request对象
Cookie[] cookies=request.getCookie();
2.遍历数组,获取每一个Cookie对象
3.使用对象方法获取数据
cookie.getName();
cookie.getValue();
Cookie的实现是基于HTTP协议的
1.Cookie不能直接存储中文
如需要存储,则需要进行转码:URL编码
编码
URLEncoder.encode(value,"UTF-8");
解码
URLDecoder.decode(value,"UTF-8");
1.获取Session对象
HttpSession session=request.getSession();
2.Session对象功能
setAttribute(String name,Object o); 存储数据到session域中
getAttribute(String name):根据key,获取值
removeAttribute(String name):根据key,删除该键值对
Session的实现是基于Cookie的
Session的钝化、活化
Session销毁:
默认情况下,无操作,30分钟自动销毁
<session-config>
<session-timeout>30session-timeout>
session-config>
调用Session对象的invalidate()方法,自毁
//1.定义类,实现Filter接口,并重写其所有方法
public class FilterDemo implements Filter{
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
}
}
2.配置Filter拦截资源的路径:在类上定义@WebFilter注解
@WebFilter("/*")
public class FilterDemo implements Filter{}
3.在doFilter方法中输出一段话,并放行
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
System.out.println("放行前逻辑被执行了...");
chain.doFilter(request,response);
System.out.println("放行后逻辑被执行了...");
}
1.放行后访问对应资源,资源访问完成后,会回到Filter中
2.回到Filter中,会执行放行后的逻辑
@WebFilter("/*")
1.拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截
2.目录拦截:/user/*:访问/user下的所有资源,都会被拦截
3.后缀名拦截:*.jsp,访问后缀名为jsp的资源,都会被拦截
4.拦截所有:/*:访问所有资源,都会被拦截
//访问服务器资源时,需要先进行登录验证,如果没有登录,则自动跳转到登录页面
@WebFilter("/*")
public class Filter1 implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest req= (HttpServletRequest) request;
//1.定义一个字符串数组,数据中存储的是需要放行的资源路径
String[] urls={"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
//2.获取用户请求资源路径
String uri=req.getRequestURI();
//3.遍历字符串数组,获取每一个需要放行的资源路径
for (String url : urls) {
if (uri.contains(url)){
//用户请求资源包含需要放行的资源路径
chain.doFilter(request, response);
return;
}
}
//1.获取session对象
HttpSession session = req.getSession();
//2从Session中获取User对象
Object user = session.getAttribute("user");
//3.判断返回的user对象是否为null
if (user==null){
request.setAttribute("login_msg","您尚未登录");
request.getRequestDispatcher("/login.jsp").forward(req, response);
}else {
//已经登陆过了,放行
chain.doFilter(request, response);
}
}
}
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据
异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新网页的技术,如搜索联想,用户名是否可用校验,等等
与 POST 相比,GET 更简单也更快,并且在大部分情况下都能用。
然而,在以下情况中,请使用 POST 请求:
1.编写AjaxServlet,并使用response输出字符串
2.创建XMLHttpRequest对象:用于和服务器交换数据
3.向服务器发送请求
4.获取服务器响应数据
1.引入Axios的js文件
2.使用axios发送请求,并获取响应结果
axios({
method:"get",
url:"http://localhost/web/axiosServlet?username="+this.value
}).then(function (resp) {
alert(resp.data);
});
axios({
method:"post",
url:"http://localhost/web/axiosServlet",
data:"username="+this.value
}).then(function (resp) {
alert(resp.data);
});
axios.get(url,config)
axios.post(url,data,config)
JSON
{
"name":"zhangsan",
"age":23,
"city":"北京"
}
value的数据类型为:
数字,整数或浮点型
字符串(在双引号中)
逻辑值(true或false)
数组(在方括号中)
对象(在花括号中)
null
注意:
Axios中,JSON字符串和JS对象自动进行转换
1、定义JSON字符串
var jsonStr="{"name":"zhangsan","age":23,"addr":["北京","上海","西安"]}"
2、将JSON字符串转为JS对象
let jsObject=JSON.parse(jsonStr);
3、JS对象转为JSON字符串
let jsonStr2=JSON.Stringify(jsObject);
Fastjson是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库,是目前Java语言中最快的JSON库,可以实现Java对象和JSON字符串的相互转换
使用:
导入坐标
com.alibaba
fastjson
1.2.58
请求数据:JSON字符串转为Java对象
User user=JSON.parseObject(jsonStr,User.class);
响应数据:Java对象转为JSON字符串
String jsonStr=JSON.toJSONString(obj);
v-bind 在html标签绑定属性值,如设置href,css样式
v-model 在表单元素上创建双向数据绑定
v-on 为html标签绑定事件
v-if,v-else,v-else-if 条件性的渲染某元素,判定为true时渲染,否则不渲染
v-show 根据条件展示某元素,区别在于切换的是display属性的值
v-for 列表渲染,遍历容器元素或者对象的属性
<a v-bind:href="url">百度一下a>
<a :href="url">百度一下a>
<input v-model="username">
html:
<input type="button" value="一个按钮" v-on:click="show()">
<input type="button" value="一个按钮" @click="show()">
vue:
new Vue({
el:"#app",
methods:{
show(){
alert("我被点了");
}
}
})
v-if:
<body>
<div id="app">
<div v-if="count == 3">div1div>
<div v-else-if="count == 4">div2div>
<div v-else>div3div>
<hr>
<input v-model="count">
div>
<script src="js/axios-0.18.0.js">script>
<script src="js/vue.js">script>
<script>
new Vue({
el:"#app",
data(){
return {
count:3
}
}
});
script>
body>
v-for:
<tr v-for="(brand,i) in brands" align="center">
<td>{{i+1}}td>
<td>{{brand.brandName}}td>
<td>{{brand.companyName}}td>
<td>{{brand.ordered}}td>
<td>{{brand.description}}td>
<td>{{brand.statusStr}}td>
<td><a href="#">修改a> <a href="#">删除a>td>
tr>
<script>
new Vue({
el: "#app",
data() {
return {
brands: []
}
},
mounted() {
axios({
method: "get",
url: "http://localhost/brand-demo/selectAllServlet"
}).then((resp) => {
this.brands = resp.data
});
}
});
script>