JAVAEE
web前端
作用:1.让用户输入数据 2.显示数据,发送请求 3.接受请求中数据并进行处理,做出响应
web程序:网页(界面)+服务器 B/S架构 = =浏览器(browser)+服务器(server)
GUI:客户端+服务器 C/S架构 == 特定客户端(client)+服务器
两者区别:
web程序不需要再电脑上安装特定客户端,只需要有浏览器即可
GUI需要安装客户端,在本地进行处理
搭建服务器Tomcat
为啥要用服务器:为了被人可以远程访问到,需要把开发的java项目部署到服务器中
安装一款免费的由apach非盈利组织提供的软件Tomcat
之前,我们的java程序都是本地运行在idea执行main方法开始运行
从javaEE开始后端程序运行到服务器上
搭建过程
1.下载 Tomcat官方站点:Apache Tomcat® - Welcome!
2.解压 获取Tomcat安装程序包,然后进行解压
tar.gz文件是Linux操作系统下的安装版本
zip文件是Windows系统下的压缩版本
3.配置环境变量
设置JAVA_HOME环境变量
设置PATH环境变量
4.进入到toncat安装文件的bin目录
startup.bat启动 stutup关闭
创建一个web后端项目并将项目部署到tomcat中
1.打开idea
2.创建一个java项目
3.为项目加一个web项目
4.在idea中集成tomcat进来并且将web后端项目部署到tomcat中
搭建EE环境
1.引入框架支持
、
2.将项目部署到tomcat服务器上
3.
部署tomcat
首先我们在下载的tomcat文件里面的lib目录下找到servlet-api.jar的jar包,然后再我们的WEB-INF的目录下创建一个lib的目录,将此jar包放在我们创建的lib目录里面,然后右击jar文件,选择Add as Library进行导入部署
创建后端项目
1.创建一个LoginServlet类然后让此类继承HttpServlet方法重写类中的方法
package com.ffyc.webback.servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /* HttpServlet是javaEE中的一个类,我们的Servlet处理类必须继承此类 这样就具备了Servlet程序功能 */ public class LoginServlet extends HttpServlet { int count; /* 用来提供服务的,每一次访问servlet程序servlet方法都会被执行,多次执行 */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("service");//接收 } /* 在服务器关闭时会被调用,可以在服务器关闭是执行一些必要的操作 此方法可以在我们的类中不重写,会调用父类中的destroy()方法 */ @Override public void destroy() { System.out.println("destroy"); } /* 在构造方法执行完成后,紧接着来执行,用来初始化servlet,只调用一次 如果没有初始化需求也可以不重写,但是会调用父类中的方法 */ @Override public void init(ServletConfig config) throws ServletException { System.out.println("init"+config.getInitParameter("count")); } /* 无参方法,初始化创建的对象 在第一次访问Servlet对象或者服务器启动时被调用,并且只调用一次 */ public LoginServlet_back(){ System.out.println("无参构造方法"); } }
2.在web.xml进行配置
<?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"> <!-- xml文件 html文件 属于 标记语言/标签 xml主要是用来在项目中存储配置信息的,有固定的格式 web.xml文件,是web项目中的配置文件,里面配置servlet,过滤器,···· 在服务器启动时,由tomcat加载兑取里面的配置数据 --> <!-- 配置servlet类的地址 --> <servlet> <servlet-name>loginServlet</servlet-name><!--定义servlet对象的名字--> <!-- 配置servlet类的地址,在第一次或启动服务器时,由服务器通过反射机制创建次servlet对象制 默认是第一次访问servlet时创建对象 还可以配置在启动时创建对象 --> <servlet-class>com.ffyc.webback.servlet.LoginServlet</servlet-class> <init-param> <param-name>count</param-name> <param-value>0</param-value> </init-param> <load-on-startup>1</load-on-startup><!--服务器启动时创建对象--> </servlet> <!-- 为指定nama的servlet配置一个供前端进行访问映射地址 --> <servlet-mapping> <servlet-name>loginServlet</servlet-name><!--找对应的servlet--> <url-pattern>/login</url-pattern><!--映射地址,必须以/开头 /表示http://localhost:8080/JAVAeeSTUDY/ --> </servlet-mapping> </web-app>
3.前端建立连接响应后端
(1).后端代码
package com.ffyc.webback.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.sql.SQLException; /* HttpServlet是javaEE中的一个类,我们的Servlet处理类必须继承此类 这样就具备了Servlet程序功能 */ public class LoginServlet_back1 extends HttpServlet { //无参构造 //init() 不重写 也会执行,调用父类的方法 调用一次 //destroy() 不重写 也会执行,调用父类的方法 调用一次 在服务器关闭时执行 /* 用来提供服务的,每一次访问servlet程序servlet方法都会被执行,多次执行 提供一个用来封装请求的对象 提供一个用来封装响应的对象 */ @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("service");//接收 //接收从前端提交的数据 String name = req.getParameter("name"); String age = req.getParameter("age"); System.out.println(name+"::"+age); Integer a = Integer.valueOf(age); //响应 resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); out.write("<h2>保存成功<h2>"); } }
2.前端代码
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> </head> <body> <!-- http协议(超文本传输协议)是网路模型中的应用层协议,用来规定浏览器和和服务器之间如何传输超文本内容 基于tcp/ip协议,客户端和服务器之间交互必须是建立连接 属于应用层协议 当浏览器连接到服务器后,向服务器发送的请求,称为http请求 请求有哪些:提交表单 点击超链接 一个http请求包含三个部分 请求行:请求的地址,http版本,状态码 都是由浏览器自动处理 请求头:客户端的一些信息,都是由浏览器自动处理 请求体:表单post方式提交的数据区域 http请求又分为get请求方式和post请求方式 get: 超链接请求时get请求 地址栏直接访问也是get get主要用来从服务器端获取数据 向服务器端传输数据量小,并且在地址栏会显示 post: 表单提交post方式提交数据 主要用于从前端向后端传输大量数据(可以上传文件) 数据存放在请求体中,相对安全 --> <a href="http://192.168.31.250:8080/JAVAeeSTUDY/login?name=张三&age=20">访问后端servlet</a> <form action="http://192.168.31.250:8080/JAVAeeSTUDY/login" method="post"> 姓名:<input type="text" name="name" value="" /><br> 年龄:<input type="text" name="age" id="" value="" /><br> <input type="submit" value="保存"> </form> </body> </html>
前端响应HTTP请求
package com.ffyc.webback.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; public class LoginServlet_back2 extends HttpServlet { //第一次访问创建servlet对象 构造方法 ,init service //如果我们的servlet中没有重写service方法,那么会调用付类中的service方法 //在父类service方法判断请求方式 /* 处理get请求 HttpServletRequest 表示请求对象,服务器会将请求的对象都封装到此对象中 我们可以通过此对象获取到请求中的所有数据 HttpServletResponse */ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("deGet"); //接收请求中自己提交的数据 String name = req.getParameter("name"); String age = req.getParameter("age"); System.out.println(name+":"+age); } /* 处理put请求 */ @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doPost"); //接收请求中自己提交的数据 req.setCharacterEncoding("utf-8");//设置请求中数据解码的格式 String name = req.getParameter("name"); String age = req.getParameter("age"); String gender = req.getParameter("gender"); String[] habby =req.getParameterValues("hobby"); System.out.println(name+":"+age+":"+gender+":"+Arrays.toString(habby)); //接收请求中的键 // Enumeration<String> parameterNmaes = req.getParameterNames(); // while (parameterNmaes.hasMoreElements()){ // System.out.println(parameterNmaes.nextElement()); // } //接收请求中的其他数据 System.out.println(req.getMethod()); System.out.println(req.getRequestURL());//请求地址 System.out.println(req.getScheme()); System.out.println(req.getServerName());//服务器名字 System.out.println(req.getServerPort());//服务器的端口 System.out.println(req.getProtocol());//请求协议 System.out.println(req.getRemoteAddr());//客户端的ip System.out.println(req.getRemotePort());//客户端端口 //接收请求头的数据 System.out.println(req.getHeader("Content-Length")); /* 响应 响应状态码: 200 ok 响应成功 404 请求到了服务器,但是目标资源没有 500 服务器内部错误,java代码报错,没有处理 */ //设置响应头 resp.setHeader("Content-Type","text/html;charset=utf-8"); PrintWriter writer = resp.getWriter(); writer.write("<h1>你好客户端</h1>");//响应体数据 } }
跨域请求
1.写一个跨域的类
package com.ffyc.webback.fiter; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; 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", "127.0.0.1"));//允许所有请求跨域 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); } }
2.在xml里面设置跨域请求响应
<!--配置允许跨域响应--> <filter> <filter-name>corsFilter</filter-name> <filter-class>com.ffyc.webback.fiter.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>corsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
设置过滤器
、1.设置过滤器
package com.ffyc.webback.fiter; import javax.servlet.*; import java.io.IOException; public class EncodFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("过滤器"); servletRequest.setCharacterEncoding("utf-8"); //让进入过滤器中的请求, filterChain.doFilter(servletRequest,servletResponse); @Override public void init(FilterConfig filterConfig) throws ServletException { 初始化对象 } @Override public void destroy() { 销毁 } } }
2.在xml里面设置过滤器响应
配置过滤器 <filter> <filter-name>encodiFilter</filter-name> <filter-class>com.ffyc.webback.fiter.EncodFilter</filter-class> <!-- <init-param>--> <!-- <param-name>0</param-name>--> <!-- <param-value>1</param-value>--> <!-- </init-param>--> </filter> <!--配置进入到过滤器的映射地址--> <filter-mapping> <filter-name>encodiFilter</filter-name> <url-pattern>/*</url-pattern><!--配置可以进入的地址--> </filter-mapping>
前后端交互涉及到了两种不同语言进行交互 以前java把数据写入到一个xml文件中把xml文件传给前端,前端解析,此做法非常复杂现在交互中,产生一种轻量级的数据格式{name:"jim",age:"20"} student对象--->{name:"jim",age:"20"}
所以窗机一个student类进行数据格式的改变
package com.ffyc.webback.servlet; import com.fasterxml.jackson.databind.ObjectMapper; import com.ffyc.webback.model.Student; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class LoginServlet_back3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String account = req.getParameter("account"); System.out.println(account); resp.setHeader("content-Type","text/html;charset=utf-8"); if (account.equals("abcd")){ resp.getWriter().print("已经被注册"); }else { resp.getWriter().print("ok"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // String account = req.getParameter("account"); // System.out.println(account); resp.setHeader("content-Type","text/html;charset=utf-8"); // if (account.equals("abcd")){ // resp.getWriter().print("已经被注册"); // }else { // resp.getWriter().print("ok"); // } String num = req.getParameter("num"); Student student = new Student(num,"jem","10","15029525224"); // resp.getWriter().print(student); /* 设计到了两种不同语言进行交互 以前java把数据写入到一个xml文件中 把xml文件传给前端,前端解析,此做法非常复杂 现在交互中,产生一种轻量级的数据格式{name:"jim",age:"20"} student对象--->{name:"jim",age:"20"} */ ObjectMapper objectMapper = new ObjectMapper(); String s = objectMapper.writeValueAsString(student); System.out.println(s); resp.getWriter().print(s); } }
前端进行访问
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script src = "js/axios.min.js"></script> <script> function checkAccount(num){ // axios.get("http://127.0.0.1:8080/JAVAeeSTUDY/login?account="+account).then(function(resp){ // document.getElementById("aid").innerHTML = resp.data; // }) axios.post("http://127.0.0.1:8080/JAVAeeSTUDY/login","num="+num).then(function(resp){ document.getElementById("aid").innerHTML = resp.data; }) } </script> </head> <body> <form method="post"> 账号:<input type="text" name="num" value="" οnblur="checkAccount(this.value)"/><span id="aid"></span><br> </form> </body> </html>