文章目录
项目构成
前言
我们都清楚在之前所学到的javaSE中,写GUI在本地安装进行的不能通过远程来访问,然而JavaEE则是把写好的程序部署到服务器中,用户可通过浏览器远程进行访问服务器 让服务器调用部署在服务器中的java程序,然后Java程序去处理用户发送的请求(与数据库连接)
一.安装并搭建Tomcat服务器
二.Servlet的创建和作用
1.作用:
接收用户发送的求求数据
调用其他java程序进行处理
根据处理结果,将结果响应给用户
2.创建:
登录后端进行处理程序
创建Servlet类去继承HttpServlet
在WEB-INF -lib中导入Servlet api
Servlet程序的方法
1.请求之后执行
①一次http请求发送到后端找到Servlet程序,是按照一个特定的顺序调用方法的
②构造方法()最先执行一次 创建完对象之后初始化对象
init() 在构造方法之后执行一次,初始化servlet对象
Service() 每次请求都会执行,提供服务的
destory() 在服务器关闭时执行一些操作
③在哪规定调用顺序,在最上层定义一个servlet接口,所有JavaEE实现了Servlet(init,service,destory)接口的类
④当我们第一次向Servlet发送请求时,会由服务器创建此servlet对象,只创建了一个(默认的)
示例如下:
/*
当我们第一次向servlet发送请求时,会由服务器创建此servlet对象,只创建了一个(默认)
*/
public LoginServlet() {
System.out.println("无参构造");
}
/*
在构造方法执行完后立即执行,用来初始化servlet
*/
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init"+":"+config.getInitParameter("n"));
}
//读取配置信息
/*
为前端提供服务,每次请求都会访问
Tomcat运行java接口 Tomcat实现
HttpServletRequest 表示请求,封装请求数据,
HttpServletResponse 表示响应
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service");
}
/*
在服务器关闭时,让我们servlet程序可以去执行某些最终操作
*/
@Override
public void destroy() {
System.out.println("destroy");
}
2.Servlet类对象的生命周期
生: 服务器启动时/第一次访问时 构造方法:1次
初始化: 在构造方法执行之后 init()1次
服务: service() 多次
销毁: 服务器关闭时 destory() 1次
web.xml
1.xml :可扩展编辑语言(用来存储数据)
以特定的格式存储项目配置信息
2.html:修饰内容
3.web.xml:存储自己的配置文件,服务器启动时由服务器加载读取(配置Servlet,过滤器等)
示例如下:
<!--配置注册项目中的servlet-->
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.ffyc.webback.servlet.LoginServlet</servlet-class>
</servlet>
<!--为servlet对象配置访问地址-->
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
<!--配置编码encode过滤器-->
<filter>
<filter-name>encode</filter-name>
<filter-class>com.ffyc.webback.filter.EncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encode</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
三.HTTP请求(超文本传输协议,依赖于TCP/IP协议)
1.http请求包含:
请求行: 请求地址,方式,状态
请求头: 包含服务器信息,客户端信息,以键值对向后端发送,然而键是固定的
请求体: 存放post请求方式,向服务器发送数据
2.http中的两种方法/方式
get: 点击超链接,表单 method:“get” 直接在地址栏中输入地址
(没有请求体)
post: 表单 method:“post”
3.两种方式的区别:
get请求
①主要用于从服务器端获取数据,
也可以向服务器发送数据 如何发送?–>后端地址?键=值&&键=值
②不能传递过多的数据,因为浏览器会限制(1-2KB)
③ 请求中的数据在地址后面显示,不能传递敏感性数据,安全性低
post请求
①主要用于向后端发送数据,请求数据存放在请求体中,不显示在地址栏中
②相对安全,传输数据量大,没有限制(可传输文件)
后端接收进行响应
1.后端处理
①由于前端向后端发送请求有两种方式,后端则进行处理时有两种方式,由doGet()和 doPost()方式进行对应处理
②虽然调用这两种方法,但是构造方法,init(),service(),destory()方法依然会执行
③如果Servlet中没有需要初始化的内容时,可以不重写init()方法,但是服务器会调用父类的init()方法
④父类中已经重写了service()方法,并且根据请求方式进行判断
get–>doGet()
post–>doPost()
⑤如果没有最终执行的操作时,服务器还是会调用父类的destory()
2.接收请求数据
示例如下:
/*
http请求发送到服务器时,Tomcat将请求所有的数据封装到HttpServletRequest类对象中,使用此对象可以获取所有请求数据
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得远端IP和端口
req.getRemoteAddr();
//请求数据中,自己传递的
req.getParameter("name");
req.getParameter("age");
//获取浏览器信息
req.getHeader("User_Agent");
//进行响应回去时,则数据必须进行编码
resp.setHeader("Content-Type", "text/html;charset=utf-8");
PrintWriter pt = resp.getWriter();
pt.print("提交成功");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取自己输入的账号
req.getParameter("account");
/*
如果账号中有中文的话,在Tomcat8之后如果是get请求中,则没有影响
如果是post请求的话,则会乱码,因此需要一个解码规则
*/
//需要进行一个解码规则
req.setCharacterEncoding("utf-8");
//提交多个值时需要封装一个数组
req.getParameterValues("hobby");
//进行响应回去时,则数据必须进行编码
resp.setHeader("Content-Type", "text/html;charset=utf-8");
PrintWriter pt = resp.getWriter();
pt.print("提交成功");
//pt.write("提交成功");
//print 和 write 都可以,
// 然而print底层实现都是write只不过print重载了更多的数据类型,因此用起来会更方便一点
}
四.过滤器
1:作用:.对服务器web资源进行拦截,当请求进入服务器之前需要进行判 断,有权限才可以进去,没有权限则不能进去,则返回一个状态码
2.步骤: 创建类实现接口
配置编码过滤器
示例如下:
import javax.servlet.*;
import java.io.IOException;
public class EncodeFilter implements Filter {
/*
每个servlet的doPost()中都有一个编码判断,则可以进行创建一个过滤器来进行识别
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
System.out.println("过滤器");
//filterChain,处理完后,让请求向下继续执行,下一个可能是servlet,也可能是下一个过滤器
filterChain.doFilter(servletRequest,servletResponse);
}
}
<!--配置编码encode过滤器-->
<filter>
<filter-name>encode</filter-name>
<filter-class>com.ffyc.webback.filter.EncodeFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>encode</filter-name>
<url-pattern>/*</url-pattern><!--配置哪一些地址进入过滤器-->
</filter-mapping>
五.Ajax
以前后端给前端响应数据时,是将数据封装到xml文件中,而前端接收到信息后进行解析xml
现在 使用的是Json
Ajax实质上是利用浏览器提供的一个特殊对象(XMLHTTPRequest)异步的向服务器发送请求,服务器返回部分数据,浏览器利用这些数据对页面进行部分更新,整个过程页面无刷新,不打断用户操作
同步请求与异步请求
1.同步请求
后端响应的内容,会把整个页面覆盖掉,打断了客户端的操作
2.异步请求(不同步)
①浏览器通过一个js对象进行异步请求,然而服务器响应的内容并没有覆盖掉整个网页,而是通过一个js对象来接收响应,将内容从js更新到网页中的某个标签
②前端发送异步请求:使用js提供一个XMLHTTPRequest对象,代理网页向后端发送了一个请求(异步)
③服务器响应的内容也是由此对象接收的,最终在js中将接收到的数据更新到网页的标签上
④前后端交互时,不影响网页的其他操作,网页不会刷新
3.创建XMLHTTPRequest对象进行操作
function checkAccount(account){
var httpobj=new XMLHttpRequest();
httpobj.open("GET","http://127.0.0.1:8080/javaEE/reg?account="+account,true);
//发送请求
httpobj.send(null);
//接收请求
httpobj.onreadystatechange=function(){
if(httpobj.readyState==4){
document.getElementById("msgid").innerText = httpobj.responseText;
}
}
}
跨域问题
1.产生的原因: 跨域问题是一个前端问题,它是在前后端分离架构中出现
浏览器默认不允许接收另外一个服务器的响应
2. 从一个域名的网页去请求另一个域名的资源称为跨域 ,它是由浏览器的同源策略造成的
协议,IP,端口 这三个如果有一个不同,就是跨域,也称跨服务
3.为什么限制? 主要是安全问题
4.为什么又要跨域? 项目需要,因为是前后端分离架构,前端服务调用后端服务
5.如何解决
示例如下:
/*后端解决跨域问题,在响应头中设置,告知浏览器是安全可靠的*/
public class CorsFilter implements Filter {
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
//允许携带Cookie时不能设置为* 否则前端报错
httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
filterChain.doFilter(servletRequest, servletResponse);//处理完后继续向下执行
}
}
<!--配置跨域cors过滤器-->
<filter>
<filter-name>cors</filter-name>
<filter-class>com.ffyc.webBack.filter.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
axios框架
它是一个Ajax框架
示例如下:
//相对于原始的请求,使用axios框架更加方便
axios.get("http://127.0.0.1:8080/javaEE/reg?account="+account).then(function(resp){
document.getElementById("msgid").innerText = resp.data;
});
Json
1.它是一种轻量级的数据交换格式
js—>请求—>java 在java 中它是将数据封装到对象中
Json 是为了在不同语言间传输数据方便的一种标准的数据格式
2.对象 user–>{ id:1, name:张三, paaaword:111 }
示例如下:
Admin admin = new Admin(1,"张三","111");
//两种语言对象结构不同,需要用一种标准格式进行输出,json是轻量级的格式
//导入组件,可以使用jackson,fastjson,谷歌,apache的组件进行转化
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(admin);
pt.print(json);
持续更新中…