• javaWeb


     JavaWeb

    1、HTML

    a标签超链接、绝对路径、相对路径

    ①    html     根标记

    ②    head     头标记

    ③    body     体标记

    ④    h        标题标签(h1--h6是从大到小的)

    ⑤    a         超链接(通过a标签创建超链接,href用来设置要跳转的页面路径)

    ⑥    table     表格

    ⑦    form     表单

    通过a标签创建一个超链接 
            href属性:用来设置要跳转的页面的路径
                关于路径:
                    绝对路径:以盘符开头的一个完整的路径
                    相对路径:相对于当前页面所在的路径
                    在相对路径中,通过 ../ 返回上一级目录,返回多级目录使用多个 ../
            target属性:用来设置要跳转的页面在何处打开
                _self:默认,在当前标签页打开
                _blank:在新的标签页打开    
    
    <!-- base标签中的target属性:可以通用设置当前页面中所有的超链接的打开方式 -->
    <base target="_blank"> 
    </head>
    
    <a href="../../target.html" target="_self">点我有惊喜!</a><br>
        <a href="../../target.html">点我有惊喜!</a><br>
        <a href="../../target.html">点我有惊喜!</a><br>
        <a href="../../target.html">点我有惊喜!</a><br>
    
    <body>
        <table border="1">
            <!-- border是加边框 -->
            <tr>
                <!-- 表格中的行使用tr标签,表头用th标签; 每行中的列(单元格)使用td标签来表示  -->
                <th>学号</th>
                <th>班级</th>
                <th>姓名</th>
                <th>性别</th>
                <th>数学</th>
                <th>英语</th>
            </tr>
    
            <tr>
                <td>001</td>
                <td rowspan="4">大数据</td>
                <!-- 跨行合并单元格使用rowspan属性来设置 -->
                <td>kris</td>
                <td></td>
                <td colspan="2" align="center">A</td>
                <!-- 从当前往右跨2列; 跨列合并单元格使用colspan属性来设置  -->
            </tr>
            <tr>
                <td>002</td>
                <!-- <td rowspan="4">大数据</td> -->
                <td>kris</td>
                <td></td>
                <td>B</td>
                <td>A</td>
            </tr>
            <tr>
                <td>003</td>
                <!-- <td rowspan="4">大数据</td> -->
                <td>kk</td>
                <td></td>
                <td>A</td>
                <td>C</td>
            </tr>
        </table>
    </body>
    
    
    通过form标签创建一个表单 
            action属性:用来设置服务器的地址
            method属性:用来设置发送请求的请求方式
                get:默认值,会发送一个GET请求,表单中的数据会通过浏览器的地址栏进行传输
                post:会发送一个POST请求,表单中的数据会通过请求体进行传输
    
    表单中的表单项使用input标签来表示 ,不同的表单项通过type属性来指定
    必须给每个表单项指定name属性值,用户输入的数据通过name属性值进行携带,并以键值对的形式发送到
                服务器,多个键值对之间通过 & 符合分隔,例如:user=admin&pwd=123456 
    提交按钮中显示的文本通过vlaue属性来设置

    2、CSS(标签、id、类、分组| 颜色)

    <style type="text/css">
        /*1. 标签选择器  */
        h1 {
            color:red;
        }
        
        h2 {
            color: yellow;
        }
        /* 2.id选择器,具有唯一性; 加# */
        #p1{
        color: green;
        }
        /* 3. 类选择器 class 可重复  加. */
        .p2{
            color: pink ;
        }
        /*4. 分组选择器 ,用, 分割  */
        #p1, .p2{
            font-size: 17px;
            }
        /*
        颜色:1.用英文单词;   2.红色: rgb(255,0,0)  红绿蓝三色;
           3.16进制      -> 红绿蓝  红色: #FF0000 = #ff0000 = #F00 = #f00 (简写) https://www.114la.com/other/rgb.htm
    */
         div{
             color: #ffddcc;
         }
        
    </style>
    
    </head>
    <body>
        <h1>悯农</h1>
        <h2>唐朝</h2>
        <p id="p1">锄禾和党务</p>
        <p class="p2">汗滴禾下土</p>
        <div>
            div标签,默认占一行;
        </div>
        
    </body>

    jquery

     3、tomcat

    Tomcat服务的目录结构;设置环境变量;

     

     在Eclipse中配置运行环境

    静态工程就一个WebContent目录,只能放页面不能写java代码;

    动态工程可写java代码,放src下;Web-INF是私密的,浏览器不能访问,只有服务器有权限来访问(里边的lib是用来放jar包的),所以页面html等不能放到Web-INF里边。

    在webcontent目录下创建index可在服务器上运行,因为在xml文件里边它已经默认有这个地址了

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>

    在总的服务器下xml还有它的配置

    <welcome-file-list>
            <welcome-file>index.html</welcome-file>
            <welcome-file>index.htm</welcome-file>
            <welcome-file>index.jsp</welcome-file>
        </welcome-file-list>

    通过服务器在浏览器中访问的页面不是工作空间中的页面,tomcat会自动把它放到服务器里,运行的是服务器里边的;

    它把工作空间里边的WebContent整个目录copy到tmp0wtpwebapps目录下,把工作空间中WebContent目录名改成了工程名;把工作空间中src下java代码放在了WEB-INF目录下创建了classes目录里边放字节码文件;服务器只管这两个目录下的东西,其他的不管,所以要把配置文件放到src下面或者字节创建一个源码包config专门放配置文件;

     2、Servlet

    public abstract class GenericServlet implements Servlet, ServletConfig,
            java.io.Serializable 
    
    public abstract class HttpServlet extends GenericServlet

    1)  Servlet的实例对象由Servlet容器负责创建;Servlet的方法由容器在特定情况下调用;Servlet容器(tomcat就是其中之一)会在Web应用卸载时销毁Servlet对象的实例。

    servlet接口,创建类实现这个接口;由servlet容器即tomcat来造对象,自动new对象,自动来调用相应的方法来实现功能,不需手动来调。

    2)  简单可以理解为  Servlet就是用来处理客户端的请求的.

    Servlet狭义的概念它的接口以及它的子接口;广义概念上是只要写了类实现了这个接口就称为Servlet;

    WEB-INF下的东西服务器可以访问,浏览器不能访问。

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
    
        <!--注册Servlet,即我写了一个类,需要容器tomcat帮我实现造下对象  -->
        <servlet>
            <!--给当前Servlet起一个名词,可任意指定,通常使用类名作为Servlet的名称  -->
            <servlet-name>HelloServlet</servlet-name>
            <!--指定Servlet接口实现类的全名称,Servlet容器tomcat会利用反射创建Servlet接口实现类对象  -->
            <servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
        </servlet>
    <!-- 映射Servlet,即告诉它这个Servlet处于哪个请求的 -->
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>  类名
        <!-- 请求映射地址
        /就代表 http://localhost:8080/Web01/这一串;发请求用你写的MyFirstServlet
          -->
        <url-pattern>/MyFirstServlet</url-pattern>
                /后边写什么就是告诉它处理的什么请求,浏览器地址栏访问的
    </servlet-mapping>
    
    </web-app> 

     写一个HelloServlet类实现这个接口

    ①、手动写一个类继承它 -- >> implements Servlet继承接口
    @Override //其中有一个是用来处理用户请求的方法
        public void service(ServletRequest req, ServletResponse res){
    }
    ServletRequest为一个接口,ServletResponse也是一个接口。
    
    

    ②、自动创建一个类会自动 extends继承HttpServlet类
    public abstract class HttpServlet extends GenericServlet {} public abstract class GenericServlet implements Servlet, ServletConfig,java.io.Serializable {} 两个方法,举例doGet方法: protected void doGet(HttpServletRequest request, HttpServletResponse response) { } HttpServletRequest request 是一个接口,继承了ServletRequest接口 public interface HttpServletRequest extends ServletRequest(它也是一个接口) {} HttpServletResponse response 接口,继承了ServletResponse接口 public interface HttpServletResponse extends ServletResponse(接口) {} //响应乱码问题: 服务器给浏览器发送的响应信息 res.setContentType("text/html;charset=UTF-8"); //获取一个打印流 PrintWriter writer = res.getWriter(); writer.write("response success!"); writer.print("响应成功"); 浏览器页面展示:response success!响应成功 //GET请求的请求乱码问题的解决方案:在Tomcat的server.xml配置文件中的第一个Connector标签中添加属性URIEncoding="UTF-8" <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/> 如:注册登录输入中文字符,在后台得到就不至于乱码了; //POST请求的请求乱码问题的解决方案:request.setCharacterEncoding("UTF-8"); 给浏览器响应一个字符串或者一个页面 //解决响应中文乱码问题 response.setContentType("text/html;charset=UTF-8"); PrintWriter writer = response.getWriter(); writer.write("响应成功!"); // writer.write("<!DOCTYPE html>");
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.Servlet;
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class HelloServlet implements Servlet {
        //它会自动来new HelloServlet,调用service来处理请求;
        @Override
        public void init(ServletConfig config) throws ServletException {
     
        }
    
        @Override
        public ServletConfig getServletConfig() {
            return null;
        }
    
        @Override //用来处理用户请求的方法
        public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
            System.out.println("收到");
            
            //响应乱码问题:
            res.setContentType("text/html;charset=UTF-8");
            //获取一个打印流
            PrintWriter writer = res.getWriter();
            writer.write("response success!");
            writer.print("响应成功");    
        }
    
        @Override
        public String getServletInfo() {
            return null;
        }
        @Override
        public void destroy() {}
    }

    ctrl+shift+T 搜索servlet可以导入apache-tomcat..src源码;

     request和response的作用

    public class AutoServlt extends HttpServlet {
        private static final long serialVersionUID = 1L; 
        /**
         * @see HttpServlet#HttpServlet()
         */
        public AutoServlt() {
            super();
        }
    
        /**
         * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //GET请求的请求乱码问题的解决方案:在Tomcat的server.xml配置文件中的第一个Connector标签中添加属性URIEncoding="UTF-8"
            //request的作用
            //1.获取请求参数
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println("GET:" + username);
            System.out.println("GET:" + password);
            //2.获取项目的虚拟路径
            String path = request.getContextPath();
            System.out.println(path);
            //3.获取转发器并请求转发
            RequestDispatcher rd = request.getRequestDispatcher("pages/login_success.html");
            rd.forward(request, response);
            
            
        }
    
        /**
         * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
         */
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("Post请求");
            //Post请求乱码
            request.setCharacterEncoding("UTF-8");
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            System.out.println("POST:" + username);
            System.out.println("POST" + password);
            
            //response的作用
            //1.给浏览器响应一个字符串或者一个页面
            //解决响应中文乱码问题
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter writer = response.getWriter();
    //        writer.write("响应成功!");
    //        writer.write("<!DOCTYPE html>");
    //        writer.write("<html>");
            
            //2.重定向
            response.sendRedirect(request.getContextPath() + "/pages/login_success.html");
    //doGet(request, response);
        }
    
    }

    路径

    以 / 开头的路径即为绝对路径,它代表的意义不一样;
    / 代表的意义:
    如果地址由浏览器解析,那么 / 就代表http://localhost:8080/
      1)html标签中的路径
      2)重定向中的路径(浏览器发送了第二次请求)
    <base href="http://localhost:8080/Web03/"> base标签中的href属性可以让当前页面中的所有相对路径变为绝对路径它会与其他连接中的地址拼。
    如果地址由服务器解析,那么
    / 就代表http://localhost:8080/Web_Ex/,比它多了个项目名;   1)web.xml中url-pattern标签中的路径   2)转发中的路径

     转发与重定向的区别

    转发:

    A(浏览器)向C(服务器)发请求一次请求,在A不知道的情况下,C服务器在它自己内部从B那拿到2K给了A; 用户登录失败进行转发;

    重定向:

    服务器发送两次请求两次request请求; A向C发请求,C直接拒绝了,但给它重定向抛了一个地址让它去找B,它又给B发请求

     可以重定向一个页面,也可以重定向一个类等。最好是用户登录成功进行重定向;

    提供了对数据库进行增删改查的Dao;

    BasicDao类是封装一个对数据库的增删改查的方法(获取连接使用JDBCUtils工具类调用getconnection方法

    通用的增删改的方法 int update(String sql, Object...params)、getBean方法是获取一个对象<T> T getBean(Class<T> type, String sql, Object... params) ;

    getBeanList是获取一个集合List :  <T> List<T> getBeanList(Class<T> type, String sql, Object... params)  全部对象;

    UserDao 提供一个接口; 传入的用户名和密码从数据库中查询对应的记录,进行校验;// 调用BasicDao中获取一个对象的方法

    UserDaoImpl实现类实现UserDao接口;

    util--JDBCUtils工具类实现获取连接和释放连接的方法,使用了DruidDataSourceFactory连接池

     JSP

    <body>
        <!--1.JSP脚本片段作用:用来在里面写Java代码-->
        <%
            Date date = new Date();
            for(int i=0; i<5; i++){
                out.println("jsp");  //会输出到页面显示,而System.out.println()在控制台打印;
            
        %>        
            <h2>out.println("Hello World!");</h2>
        <%
            }
        %>
            <!-- 2.JSP表达式作用:用来输出对象 -->
        <h2>北京时间: <%=date %></h2>
        <%=request.getContextPath() %>  <!--页面中输出 /WebJSP -->
    
    </body>

      1)   JSP全称Java Server Pages,顾名思义就是运行在java服务器中的页面,也就是在我们JavaWeb中的动态页面,其本质就是一个Servlet。

      2)   其本身是一个动态网页技术标准,它的主要构成有HTML网页代码、Java代码片段、JSP标签几部分组成,后缀是.jsp

      3)   相比于Servlet,JSP更加善于处理显示页面而Servlet跟擅长处理业务逻辑,两种技术各有专长,所以一般我们会将Servlet和JSP结合使用,Servlet负责业务,JSP负责显示。

      4)  一般情况下, 都是Servlet处理完的数据,转发到JSP,JSP负责显示数据的工作

      5)  JSP的脚本元素

    脚本片段是嵌入到JSP中Java代码段,格式以<%开头,%>结尾,两个%号之间就可以编写Java代码了

      

    JSP的表达式;  JSP表达式用来直接将Java变量输出到页面中,格式以<%=开头,以%>结尾,中间是我们要输出的内容

      

      6)JSP的9大隐含对象

        ①  out(JspWriter):相当于response.getWriter()获取的对象,用于在页面中显示信息。

        ② config(ServletConfig):对应Servlet中的ServletConfig对象。

        ③page(Object):对应当前Servlet对象,实际上就是this。

        ④ pageContext(PageContext):当前页面的上下文,也是一个域对象。

      url:"${pageContext.request.contextPath}/AjaxServlet",   可用来获取项目虚拟路径;

        ⑤ exception(Throwable):错误页面中异常对象

        ⑥ request(HttpServletRequest):HttpServletRequest对象

        ⑦response(HttpServletResponse):HttpServletResponse对象

        ⑧ application(ServletContext):ServletContext对象

        ⑨ session(HttpSession):HttpSession对象

        7)  EL表达式

        ① EL是JSP内置的表达式语言,用以访问页面的上下文以及不同作用域中的对象取得对象属性的值,或执行简单的运算或判断操作。EL在得到某个数据时,会自动进行数据类型的转换。

        ② EL表达式用于代替JSP表达式(<%= %>)在页面中做输出操作

        ③ EL表达式仅仅用来读取数据,而不能对数据进行修改。

        ④ 使用EL表达式输出数据时,如果有则输出数据,如果为null则什么也不输出。

        ⑤ EL表达式的语法:

           

        ⑥ EL取值的四个域:

          pageScope   requestScope  sessionScope  applicationScope

     域

        四个域
                page域
                    范围:当前页面
                    对应的域对象:pageContext
                    域对象的类型:PageContext
                request域
                    范围:当前请求(一次请求)
                    对应的域对象:request
                    域对象的类型:HttpServletRequest
                session域
                    范围:当前会话(一次会话)
                    对应的域对象:session
                    域对象的类型:HttpSession
                application
                    范围:当前Web应用
                    对应的域对象:application
                    域对象的类型:ServletContext
                四个域对象都有以下三个方法:
                    void setAttribute(String key , Object value)    
                    Object getAttribute(String key)
                    void removeAttribute(String key)
                四个域对象的使用规则:能用小的就不用大的    
    <body>
        <%
            pageContext.setAttribute("pagekey", "pageValue");//当前页面 
            request.setAttribute("reqkey", "reqvalue");      //当前一次请求 
            session.setAttribute("session", "sessionValue"); //当前一次会话 
            application.setAttribute("application", "appliValue"); //当前web应用 
        %>
    <h2>在当前页面获取属性值</h2> page域的属性值:<%=pageContext.getAttribute("pagekey") %> <!-- 把当前页面转发了就变为null --> <br> request域中属性值:<%=request.getAttribute("reqkey") %> <!-- 连接如超连接 --> <br> session域中属性值:<%=session.getAttribute("session") %> <!-- 把浏览器关了就没了 --> <br> application域中属性值:<%=application.getAttribute("application") %><!--重启下服务器就失效了 --> <!-- 转发到scope2页面 --> <jsp:forward page="/scope2.jsp"></jsp:forward> <br> <a href="/WebJSP/scope2.jsp">去scope2页面</a> <!-- 超链接,浏览器,2次请求 --> </body>

    cope2.jsp
    <body> <h2>在scope2页面获取属性值</h2> page域的属性值:<%=pageContext.getAttribute("pageKey") %> <br> request域中属性值:<%=request.getAttribute("reqkey") %> <br> session域中属性值:<%=session.getAttribute("session") %> <br> application域中属性值:<%=application.getAttribute("application") %> </body>
             
          精确获取域中的属性值:

            获取request域中的属性值:requestScope. sessionScope:获取session域中的属性值 applicationScope -获取application域中的属性值 --> <% Date date = new Date(); pageContext.setAttribute("date", date+"-"); request.setAttribute("date", date+"--"); session.setAttribute("date", date+"---"); application.setAttribute("date", date+"----"); //创建Employee对象 Employee emp = new Employee(1,"kk",new Department(1001,"设计部")); //将emp返到page域中 pageContext.setAttribute("emp", emp); %> 通过EL表达式输出当前的时间:${date }<br> 精确获取request域中的属性值:${requestScope.date }<br> 通过EL表达式输入Employee对象的lastName属性值:${emp.lastName }<br> 通过EL表达式输入Employee对象的dept属性的name属性值:${emp.dept.name }<br> 通过EL表达式获取getStatus方法的返回值:${emp.status } </body>

     JSTL(JSP Standard Tag Library 即jsp的标准标签库,提高标签)

    它有5中标签库:core核心标签库、fmt标签库、functions标签库、sql标签库、xml标签库(后两种已经被淘汰;)

    C:开头的标签、函数标签库(结合函数可以对字符串进行截取替换)、格式化标签库fmt:开头的(国际化使用的); 需要导jar包

    在jsp的页面要加上:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>   
    <body>  if标签,相当于java中的if条件判断语句; test属性用来接收一个布尔型的值,通常通过EL表达式获取,当值为true时才执行标签体中的内容;
        <%
            int age = 20;
            pageContext.setAttribute("age", age);
        %>
        <c:if test="${age < 19}">
            好好学习
        
        </c:if>
        
        <c:if test="${age > 19}">
            玩吧
        </c:if>
        
        <%
            List<String> list = new ArrayList();
            list.add("hello");
            list.add("java");
            list.add("world");
            list.add("hi");
            list.add("he");
            list.add("");
            
            //将list域放到page域中 
            pageContext.setAttribute("keys", list);
        %>
    <!--     items接收一个要遍历的集合
        var 设置一个变量来接收遍历到的数据,以变量的值为key将数据放到page域中  -->
        <c:forEach items="${keys }" var="key">
            <a href="#">${pageScope.key }</a>
            <br>
        </c:forEach>
        
         <!-- empty运算符:用来判断一个字符串或者一个集合是否为空 -->
        <c:if test="${empty keys }">
            空的!
        </c:if>
        <c:if test="${not empty keys }">
            empty!
        </c:if>
        
        <c:if test="${!empty keys}">
            非空!
        
        </c:if>
    </body>
    <base href="http://localhost:8080/Web_Login/"> 
    <style type="text/css">
        body{
            background-color: pink;
        }
        form{
            font-size: 18px;
            color: white;
        }
    </style>
    <!-- 在js中引入jquery -->
    <script type="text/javascript" src="jquery/jquery-1.7.2.js"></script>
    <script type="text/javascript">
        $(function() {
            //给文本框绑定焦点事件,把错误信息给清除了
            $(function(){
                $("#username").focus(function(){
                    $("#spanMsg").text("");
                });
                
                //给提交按钮绑定单击事件 
                $("#sub").click(function(){
                    //获取用户名和密码
                    var username = $("#username").val();
                    if(username == ""){ /* username == null不能这么写空 */
                        alert("用户名不能为空");
                        return false;
                    }
                    
                    var password = $("#password").val();
                    if(password == ""){
                        alert("密码不能为空");
                        return false;
                    }        
                });
            });
        });
    </script>

     

    AJax

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Ajax</title>
    <script type="text/javascript" src="${ pageContext.request.contextPath }/script/jquery-1.7.2.js"></script>
        
    <script type="text/javascript">
        $(function(){
            $("#btId").click(function(){
                //通过$.ajax方法发送Ajax请求 
                $.ajax({
                    url:"${pageContext.request.contextPath}/AjaxServlet",//请求地址 
                    type:"get",
                    data:"username=admin&password=123", //设置请求参数 
                    //响应成功系统会自动调用success该回调函数;响应数据会以参数的形式传入该函数  
                    success:function(res){ 
                        //将相应数据设置到span标签中 
                        $("#msg").text(res);
                    },
                    dataType:"text" //设置响应类型,默认是text
                });    
            });
            //1.给按钮绑定单击事件,
            $("#btId2").click(function(){
                //2.通过$.get()/post()方法发送Ajax请求
                var url = "${pageContext.request.contextPath}/AjaxServlet";
                var params = "username=admin&password=123456";
                
                    alert(url);  //  /Web_Ajax/AjaxServlet
                $.get(url, params, function(res){
                    //将响应到的数据设置到span标签中 
                    $("#msg2").html(res)
                }, "text");
            });
    
        });
    
    </script>
    </head>
    <body>
        <button id="btId">Hello Ajax</button> <span style = "color: red" id="msg"></span>
        <br>
        <button id="btId2">Hello Ajax2</button> <span style = "color: red" id="msg2"></span>
    </body>
    </html>
    
    
    $.get/post(url, [data], [callback], [type])
                    url:必须的。用来设置请求地址
                    data:可选的。用来设置请求参数
                    callback:可选的。用来设置一个回调函数,响应成功之后系统会自动调用该函数,
                            响应数据会以参数的形式传入到该函数中
                    type:可选的。用来设置响应数据的类型,默认是text    
    
    
    后端--->>

      * 处理Ajax请求的Servlet
      public class AjaxServlet extends HttpServlet{ }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {    
            System.out.println("Get请求");
        //获取用户名和密码; String username
    = request.getParameter("username"); String password = request.getParameter("password"); System.out.println("Get请求:" + username + " " + password); //给浏览器响应一个字符串
         response.setContentType("text/html;charset=UTF-8"); response.getWriter().write((
    "Response success!")); }

     过滤器

    右键Filter 

    Filter1.java

    public class Filter1 implements Filter {
        public Filter1() {
        }
    
        public void destroy() {
        }
    
        /**
         * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
         */
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("1.1");
            //放行请求
            chain.doFilter(request, response); 
            System.out.println("1.2");//出去的代码
            
            //如果两个都放行输出:1.1、2.1、Hello Filter、2.2、1.2
            //把第一个过滤器关了,则输出:1.1、1.2    //后面的不会执行、2.1 Hello Filter、2.2
            //把第二个过滤器关了,则输出:1.1 2.1 2.2 1.2 
            
            
        }
    
        public void init(FilterConfig fConfig) throws ServletException {
        }
    
    }
    
    loging.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
        <%
            System.out.println("Hello Filter");
        %>
        <h2>Here</h2>
    </body>
    </html>
    
    Filter2.java
    public class Filter2 implements Filter {
        public Filter2() {
        }
        public void destroy() {
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            System.out.println("2.1");
            //chain.doFilter(request, response);
            System.out.println("2.2");
    
        }
    
        public void init(FilterConfig fConfig) throws ServletException {
        }
    
    }
    
    web.xml文件的配置:
      <filter>
        <display-name>Filter1</display-name>
        <filter-name>Filter1</filter-name>
        <filter-class>com.atguigu.filter.Filter1</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>Filter1</filter-name>
        <url-pattern>/loging.jsp</url-pattern>
      </filter-mapping>
      <filter>
        <display-name>Filter2</display-name>
        <filter-name>Filter2</filter-name>
        <filter-class>com.atguigu.filter.Filter2</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>Filter2</filter-name>
        <url-pattern>/loging.jsp</url-pattern>
      </filter-mapping>
    </web-app>
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
            //获取它的子接口,HttpServletRequest才有getSession这个方法;
            HttpServletRequest hst =  (HttpServletRequest) request;
            HttpSession session = hst.getSession();
            User user = (User) session.getAttribute("user");    
            if(user != null) { //如果user对象存在,即表示登录了
                chain.doFilter(request, response); //放行
            }else {
                
                request.setAttribute("msg", "您还没登录呢");
                request.getRequestDispatcher("pages/Login.jsp").forward(request, response);
            }
            
        }

    监听器

    1)        Listener用于监听JavaWeb程序中的事件。

    2)        例如:ServletContext、HttpSession、ServletRequest的创建、修改和删除。

    3)        监听器的类型分为  

    ①      生命周期

    ②      数据绑定

        

    选择Lifecycle

    import javax.servlet.http.HttpSessionActivationListener(这里边有两个方法,钝化和活化的时候)

    import javax.servlet.http.HttpSessionBindingListener(它是放里边一个对象就会执行其方法)

    这两个接口不需要在XML文件中注册,专门给javabean类去实现的

    监听钝化(登录成功用户信息放到session中,session保存在服务器中,都是在内存里,一断电就都没了,钝化就是把session里的信息持久化到一个文件里边,当服务器关闭的时候session保存的信息会序列化到硬盘文件中)和活化(服务器读序列化的文件,从文件反序列化到内存中)的

     比如监听在线人数:就需要用全局ServletContext  application,要保证每个人看到的人数是一样的,代码如下

    User类实现这个接口 public class User implements HttpSessionBindingListener { } ;重写valueBound和valueUnbound这两个方法;

        //当User对象被添加到session域中就会被执行;所以登录验证的时候要返回一个User对象,把它放到session域中;
        @Override
        public void valueBound(HttpSessionBindingEvent event) {
            System.out.println("User对象被添加到域中了");
            HttpSession session = event.getSession();
            //获取ServletContext对象
            ServletContext application = session.getServletContext();
            //获取当前在线人数;这里要先获得count,再设置。
            Integer count = (Integer) application.getAttribute("count");
            
            
            if(count == null) {
                //还没人在线
                application.setAttribute("count", 1);
            }else {
                application.setAttribute("count", count+1);
            }
        }
        //当User对象从session域中移除时调用
        @Override
        public void valueUnbound(HttpSessionBindingEvent event) {
            
            HttpSession session = event.getSession(); //获取session
            
            ServletContext application = session.getServletContext(); //获取ServletContext域
            /*session.removeAttribute("user"); //移除user,不能在这里移除,是错误的 
            System.out.println("移除了" + session.getAttribute("user"));*/
            Integer count = (Integer) application.getAttribute("count");
            application.setAttribute("count", count-1);
            
        }
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    
    /**
     * 监听ServletContext对象的生命周期的监听器
     */
    @WebListener
    public class MyServletContextListener implements ServletContextListener {
        public MyServletContextListener() {
        }
        public void contextDestroyed(ServletContextEvent sce)  { 
             System.out.println("ServletContextEvent对象被销毁了");  //服务器关闭的时候启动
        }
        public void contextInitialized(ServletContextEvent sce)  { 
           System.out.println("ServletContextEvent对象被创建了");   //服务器开启的时候这个方法执行;
        }
    }

    XML文件

    <?xml version="1.0" encoding="UTF-8"?>
    <Student>
        <students id="1">
            <sid>001</sid>
            <name>kris</name>
            <age>18</age>
            <gender></gender>
            <address>北京</address>
        </students>
        <students id="2">
            <sid>002</sid>
            <name>smile</name>
            <age>18</age>
            <gender></gender>
            <address>海淀</address>
        </students>
        <students id="3">
            <sid>003</sid>
            <name>嘿嘿</name>
            <age>20</age>
            <gender></gender>
            <address>朝阳</address>
        </students>
    </Student>
    View Code
    package com.atguigu.test;
    
    
    
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    
    import com.atguigu.bean.Student;
    
    public class TestDom4j {
    
        public static void main(String[] args) throws DocumentException {
            //1创建解析器对象
            SAXReader saxReader = new SAXReader();
            //2解析xml文件得到Document对象;
            Document doc = saxReader.read("student.xml");
            System.out.println(doc);
            //3获取根元素
            Element rootEle = doc.getRootElement();
            //4解析所有的student元素
            List<Element> stus = rootEle.elements("students"); 
            System.out.println(stus);
            //5遍历得到每一个student标签;
            for (Element ele : stus) {
                //获取id属性值
                String id = ele.attributeValue("id"); //获取的是根元素的id
                System.out.println(id); //
                
                Element nameEle = ele.element("name");
                System.out.println("每个element的名字:" + nameEle.getText());
                
                
                String sid = ele.elementText("sid");
                String name = ele.elementText("name");
                String age = ele.elementText("age");
                String gender = ele.elementText("gender");
                String address = ele.elementText("address");
                System.out.println(sid + "	" + name + "	" + age + "	" + gender + "	" + address);
            
                Student student = new Student(sid, name, age, gender, address);
                System.out.println(student);
            }
            
            
        }
    }
    
    
    
    
    package com.atguigu.bean;
    
    public class Student {
    
        private String sid;
        private String name;
        private String age;
        private String gender;
        private String address;
        public Student() {
            super();
        }
        public Student(String sid, String name, String age, String gender, String address) {
            super();
            this.sid = sid;
            this.name = name;
            this.age = age;
            this.gender = gender;
            this.address = address;
        }
        public String getSid() {
            return sid;
        }
        public void setSid(String sid) {
            this.sid = sid;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAge() {
            return age;
        }
        public void setAge(String age) {
            this.age = age;
        }
        public String getGender() {
            return gender;
        }
        public void setGender(String gender) {
            this.gender = gender;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        @Override
        public String toString() {
            return "Student [sid=" + sid + ", name=" + name + ", age=" + age + ", gender=" + gender + ", address=" + address
                    + "]";
        }
        
        
        
    }
    View Code

    JSON

    对象和JSON字符串之间的互相转换导gson-2.2.4.jar包

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    <script type="text/javascript" src="script/jquery-1.7.2.js"></script>
    <script type="text/javascript">
        //1.JSON对象 
        var jsonObj = {"name": "kk", "age":20};
        //alert(jsonObj); //[object Object]
    
        //2.JSON数组  //获取数组中JSON对象的age属性值
        var jsonArray = ["哈哈", 100, true, null, jsonObj]
        //alert(jsonArray) //哈哈,100,true,,[object Object]
        //alert(jsonArray[4].age) //20
        
        //3.复杂点的 
        var json = {
                    "name":"唐僧",
                    "age":"20",
                    "sons":[
                        {"name": "悟空"},
                        {"name": "八戒", "wives":[
                            {"name": "嫦娥", "age": 19},
                            {"name": "白狐", "age": 18}
                        ]}
                    ]
                
        }
        alert(json.sons[1].wives[1].age) //18
        
        //前端中 两种互相的转换 --> 1.将JSON对象转换成JSON字符串
        var objToStr = JSON.stringify(jsonObj);
        alert(objToStr); //{"name":"kk","age":20}
        //2.将JSON字符串转成JSON对象 
        var jsonStr = '{"name": "smile", "age": 20}';
        var strToObj = JSON.parse(jsonStr);
        alert(strToObj.name); //[object Object] --> smile
        
        
        //-->前端响应后端传来的JSON数据;
        $(function(){
            //绑定单击事件
            $("#btId").click(function(){
                var url = "JSONServlet"; //设置请求地址 
                //发送ajax请求
                $.post(url, function(res){ 
                    alert(res.id + "-" + res.name + "-" + res.age)
                }, "json"); //接收响应的json数据 
            });
        });
        </script>
    </head>
    <body>
            <button id="btId">Ajax请求接收JSON格式的响应数据</button>
    </body>
    </html>
    
    
    
    /**
     * 响应JSON数据的Servlet
     */
    public class JSONServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println("-------------");
            User user = new User(1, "kk", 20); //假设从数据库中查询出来一个User对象
            //创建Gson对象
            Gson gson = new Gson();
            //①将User对象转换成JSON字符串
            String jsonStr = gson.toJson(user); //jsonStr字符串
            System.out.println("转成jsonStr字符串:" + jsonStr);
            //②将JSON字符串转成JSON对象
            User fromJson = gson.fromJson(jsonStr, User.class);
            
            //给前台响应一个字符串
            response.setContentType("text/html;charset=UTF-8");
            response.getWriter().write(jsonStr); //字符串
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
        }
    
    }
  • 相关阅读:
    String类的intern()方法,随常量池发生的变化
    JDK8的JVM内存结构,元空间替代永久代成为方法区及常量池的变化
    wait()、notify()方法原理,以及使用注意事项--丢失唤醒、虚假唤醒
    消费者、生产者Java代码示例,wait-notify实现
    volatile、Synchronized实现变量可见性的原理,volatile使用注意事项
    CAS及其ABA问题
    JUC包Lock机制的支持--AQS
    JUC包实现的同步机制,原理以及简单用法总结
    Synchronized机制下偏向锁、轻量级锁、重量级锁的适用场景
    临时表循环插入
  • 原文地址:https://www.cnblogs.com/shengyang17/p/10184135.html
Copyright © 2020-2023  润新知