JAVAEE搭建以及学习

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>

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值