JavaEE(企业级)

项目构成

前言

我们都清楚在之前所学到的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);

持续更新中…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值