zoukankan      html  css  js  c++  java
  • JavaWeb

    JavaWeb介绍

    • java中,动态web资源开发技术
    • web应用程序 -> Tomcat:服务器
    • web应用程序编写完毕后,若想提供给外接访问,需要服务器统一管理
    • 客户端 -> 请求 request -> 服务器 webServer
    • 服务器 -> 响应 response -> 服务器
    • 静态Web:WebServerPlugin -> WebServer -> FileSystem
    • 动态Web: WebServerPlugin -> 动态Web资源

    web服务器:处理请求、给用户响应信息

    • ASP: 微软,HTML中嵌入VB脚本
    • JSP/Servlet: B/S架构

    tomcat:一个免费的开放源代码的Web 应用服务器

    • tomcat 默认端口号:8080
    • mysql:3306
    • http:80
    • https:443
    • 默认主机名:localhost -> 127.0.0.1
    • 默认网站应用存放位置:webapps

    网站是如何进行访问的

    • 输入域名, 回车
    • 检查本机 C:WindowsSystem32driversetchosts 配置文件下有没有这个域名的映射,如果有直接返回对应的IP地址,可以直接访问;否则去DNS服务器(全世界的域名在此管理)找到返回。

    如何发布一个网站

    • 直接将自己的项目放在webapps下,就可以访问

    HTTP:超文本传输协议,一个简单的请求-响应协议(403)

    • http请求:客户端发起到服务器
    • http响应:服务器响应到客户端
    • 请求行方式:GET:一次能携带的参数较少,不安全,但高效/POST:携带参数无限制,安全不高效
    • 消息头
    • 响应状态码:200请求成功、3XX请求重定向、4XX找不到资源、5XX服务代码错误 502网关错误

    Maven: 架构管理工具

    • 核心思想:约定大于配置

    注意:maven由于他的约定大于配置,我们之后可以能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:

    <!--在build中配置resources,来防止我们资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
    

    Servlet:动态Web技术

    • sun公司在API中提供一个接口:Servlet
    • 编写一个类实现servlet接口
    • 把开发好的java类部署到web服务器
    • Servlet -> GenericServlet -> HttpServlet -> 自定义

    Servlet原理

    • 浏览器向web容器发起http请求
    • 调用servlet中的service方法
    • 自己实现类重写这些方法
    • response返回请求之后的响应,web容器读取响应信息
    • 将响应返回给客户端

    mapping

    • 一个servlet可以指定一个、多个、通用、后缀、前缀映射路径
    <!-- 注册一个servlet -->
    <servlet>
            <servlet-name>hello</servlet-name>
            <servlet-class>com.zcs.helloservlet</servlet-class>
    </servlet>
    <!-- mapping -->
    <servlet-mapping>
            <servlet-name>hello</servlet-name>
            <!-- url请求 -->
            <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    
    • 优先级:固有的映射路径优先级最高,找不到会走默认的映射路径

    ServletContext

    web容器在启动的时候,会为每个web程序都创建一个对应的ServletContext对象,它代表当前web应用

    • 共享数据:在此Servlet中保存的数据,可在另外一个Servlet中保存
    String username = "zcs";
    ServletContext context = req.getServletContext();
    context.setAttribute("username", username);
    
    • 获取初始化参数
        <!--配置一些web应用初始化参数-->
        <context-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
        </context-param>
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().print(url);
    }
    
    • 请求转发
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        System.out.println("进入了ServletDemo04");
        //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); //转发的请求路径
        //requestDispatcher.forward(req,resp); //调用forward实现请求转发;
        context.getRequestDispatcher("/gp").forward(req,resp);
    }
    
    • 读取资源文件

    Properties

    • 在java目录下新建properties
    • 在resources目录下新建properties

    发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:

    思路:需要一个文件流;

    username=root12312
    password=zxczxczxc
    
    public class ServletDemo05 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");
            Properties prop = new Properties();
            prop.load(is);
            String user = prop.getProperty("username");
            String pwd = prop.getProperty("password");
            resp.getWriter().print(user+":"+pwd);
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    HttpServletResponse

    web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;

    • 如果要获取客户端请求过来的参数:找HttpServletRequest
    • 如果要给客户端响应一些信息:找HttpServletResponse

    B一个web资源收到客户端A请求后,B他会通知A客户端去访问另外一个web资源C,这个过程叫重定向

    • 重定向和转发的区别?

    相同点

    • 页面都会实现跳转

    不同点

    • 请求转发的时候,url不会产生变化
    • 重定向时候,url地址栏会发生变化;

    session、cookie

    • cookie: 客户端技术(请求、响应)
    • session:服务器技术、可以保存会话信息
    • 服务器给每个用户(浏览器)Session对象
    • 一个Session会独占一个浏览器 -> 保存购物车信息

    Session与Cookie区别:

    JSP:Java Server Pages

    • JSP中可以嵌入Java代码,为用户提供动态数据<%%>

    原理

    • 浏览器向服务器发送请求,访问Servlet
    • JSP最终会转换成一个Java类
    • JSP本质就是一个Servlet类
    • JSP页面 -> JSP转换成的Java文件 -> xxx_jsp.java -> xxx_jsp.class -> 返回给服务器
    • JSP页面中java代码会原封不动输出、HTML代码会转换成out.write(xxx)

    基础语法、指令

      <%--JSP表达式
      作用:用来将程序的输出,输出到客户端
      <%= 变量或者表达式%>
      --%>
      <%= new java.util.Date()%>
    
    • jsp脚本片段
    
      <%--jsp脚本片段--%>
      <%
        int sum = 0;
        for (int i = 1; i <=100 ; i++) {
          sum+=i;
        }
        out.println("<h1>Sum="+sum+"</h1>");
      %>
    
    

    脚本片段的再实现

      <%
        int x = 10;
        out.println(x);
      %>
      <p>这是一个JSP文档</p>
      <%
        int y = 2;
        out.println(y);
      %>
    
      <hr>
    
    
      <%--在代码嵌入HTML元素--%>
      <%
        for (int i = 0; i < 5; i++) {
      %>
        <h1>Hello,World  <%=i%> </h1>
      <%
        }
      %>
    
    • JSP声明
      <%!
        static {
          System.out.println("Loading Servlet!");
        }
    
        private int globalVar = 0;
    
        public void zcs(){
          System.out.println("进入了方法Kuang!");
        }
      %>
    

    JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!

    在JSP,嵌入Java代码即可!

    <%%>
    <%=%>
    <%!%>
    
    <%--注释--%>
    

    JSP的注释,不会在客户端显示,HTML就会!

    • JSP指令
    <%@page args.... %>
    <%@include file=""%>
    
    <%--@include会将两个页面合二为一--%>
    
    <%@include file="common/header.jsp"%>
    <h1>网页主体</h1>
    
    <%@include file="common/footer.jsp"%>
    
    <hr>
    
    
    <%--jSP标签
        jsp:include:拼接页面,本质还是三个
        --%>
    <jsp:include page="/common/header.jsp"/>
    <h1>网页主体</h1>
    <jsp:include page="/common/footer.jsp"/>
    
    
    • 大内置对象
    • PageContext 存东西
    • Request 存东西
    • Response
    • Session 存东西
    • Application 【SerlvetContext】 存东西
    • config 【SerlvetConfig】
    • out
    • page ,不用了解
    • exception
    pageContext.setAttribute("name1","zcs1号"); //保存的数据只在一个页面中有效
    request.setAttribute("name2","zcs2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","zcs3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","zcs4号");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
    

    request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

    session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;

    application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

    • JSP标签、JSTL标签、EL表达式
    <!-- JSTL表达式的依赖 -->
    <dependency>
        <groupId>javax.servlet.jsp.jstl</groupId>
        <artifactId>jstl-api</artifactId>
        <version>1.2</version>
    </dependency>
    <!-- standard标签库 -->
    <dependency>
        <groupId>taglibs</groupId>
        <artifactId>standard</artifactId>
        <version>1.1.2</version>
    </dependency>
    
    

    EL表达式: ${ }

    • 获取数据
    • 执行运算
    • 获取web开发的常用对象

    JSP标签

    <%--jsp:include--%>
    
    <%--
    http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
    --%>
    
    <jsp:forward page="/jsptag2.jsp">
        <jsp:param name="name" value="zcs"></jsp:param>
        <jsp:param name="age" value="20"></jsp:param>
    </jsp:forward>
    

    JSTL表达式

    JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!

    格式化标签

    SQL标签

    XML 标签

    核心标签 (掌握部分)

    JSTL标签库使用步骤

    • 引入对应的 taglib
    • 使用其中的方法
    • 在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误

    c:if

    <head>
        <title>Title</title>
    </head>
    <body>
    
    
    <h4>if测试</h4>
    
    <hr>
    
    <form action="coreif.jsp" method="get">
        <%--
        EL表达式获取表单中的数据
        ${param.参数名}
        --%>
        <input type="text" name="username" value="${param.username}">
        <input type="submit" value="登录">
    </form>
    
    <%--判断如果提交的用户名是管理员,则登录成功--%>
    <c:if test="${param.username=='admin'}" var="isAdmin">
        <c:out value="管理员欢迎您!"/>
    </c:if>
    
    <%--自闭合标签--%>
    <c:out value="${isAdmin}"/>
    
    </body>
    

    c:choose c:when

    <body>
    
    <%--定义一个变量score,值为85--%>
    <c:set var="score" value="55"/>
    
    <c:choose>
        <c:when test="${score>=90}">
            你的成绩为优秀
        </c:when>
        <c:when test="${score>=80}">
            你的成绩为一般
        </c:when>
        <c:when test="${score>=70}">
            你的成绩为良好
        </c:when>
        <c:when test="${score<=60}">
            你的成绩为不及格
        </c:when>
    </c:choose>
    
    </body>
    

    c:forEach

    <%
    
        ArrayList<String> people = new ArrayList<>();
        people.add(0,"张三");
        people.add(1,"李四");
        people.add(2,"王五");
        people.add(3,"赵六");
        people.add(4,"田六");
        request.setAttribute("list",people);
    %>
    
    
    <%--
    var , 每一次遍历出来的变量
    items, 要遍历的对象
    begin,   哪里开始
    end,     到哪里
    step,   步长
    --%>
    <c:forEach var="people" items="${list}">
        <c:out value="${people}"/> <br>
    </c:forEach>
    
    <hr>
    
    <c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
        <c:out value="${people}"/> <br>
    </c:forEach>
    
    

    JavaBean有特定的写法:

    • 必须要有一个无参构造
    • 属性必须私有化
    • 必须有对应的get/set方法;

    一般用来和数据库的字段做映射 ORM;

    MVC:view -> Controller -> Model

    view

    • 展示数据模型
    • 提供用户操作

    Controller

    • 接收用户请求
    • 交给业务层, 返回数据
    • 视图跳转

    Model: service Dao -> DataBase

    • 业务处理(Service)
    • 数据持久层(Dao)

    Filter

    实现Filter接口,重写对应的方法即可

    public class CharacterEncodingFilter implements Filter {
    
    //初始化:web服务器启动,就以及初始化了,随时等待过滤对象出现!
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter初始化");
    }
    
    //Chain : 链
    /*
    1. 过滤中的所有代码,在过滤特定请求的时候都会执行
    2. 必须要让过滤器继续同行
        chain.doFilter(request,response);
    */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
    
        System.out.println("CharacterEncodingFilter执行前....");
        chain.doFilter(request,response); //让我们的请求继续走,如果不写,程序到这里就被拦截停止!
        System.out.println("CharacterEncodingFilter执行后....");
    }
    
    //销毁:web服务器关闭的时候,过滤会销毁
    public void destroy() {
        System.out.println("CharacterEncodingFilter销毁");
    }
    }
    
    1. 在web.xml中配置 Filter
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--只要是 /servlet的任何请求,会经过这个过滤器-->
        <url-pattern>/servlet/*</url-pattern>
        <!--<url-pattern>/*</url-pattern>-->
    </filter-mapping>
    
  • 相关阅读:
    维克里拍卖 Vickrey auction
    弱占优策略--Weakly Dominant Strategy
    乱码电路(Garbled circuits)
    P和NP问题
    揭秘Facebook首个数据中心:全球15亿用户的账户信息都在这里
    数学符号“s.t.”的意义
    PKI系统深入介绍
    [转]公钥,私钥和数字签名这样最好理解
    Exif
    任我行 CRM 9.4
  • 原文地址:https://www.cnblogs.com/Hot-machine/p/13296408.html
Copyright © 2011-2022 走看看