java:(九大内置对象,计算服务器访问次数,filter过滤器,MVC框架,MVC和三层架构的关系)

1.九大内置对象:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %><!-- 默认是隐藏的false -->
<%@ page session="true" %><!-- session默认是显示的true -->

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'index.jsp' starting page</title>
</head>

<body>

    <%
        application.setAttribute("name", "zhangsan");
    %>

    <%=session.getAttribute("name")%>
    <pre>
    
        jsp的四大作用域:servlet和servlet之间的参数传递
            setAttribute()// 存储变量
            getAttribute()// 获取变量
            removeAttribute()// 移除变量
          application:(应用)(一般情况下,存储的是字典表中的信息)
              就作用于整个项目,存储一些和项目相关的信息(比如省市区这些信息)(字典表)
              当服务器(tomcat)启动的时候application就已经被创建并初始化,而且所有的用户都共享同一个application
              直到服务器(tomcat)关闭时候,才会被销毁
              作用域:整个项目
              生命周期:当服务器(tomcat)启动的时候,就会被创建,当服务器关闭的时候就会被销毁
              
          request:(一次请求)(一般情况下,存储一些需要请求转发的信息)
              作用域:一次请求
              生命周期:一次请求以及所有通过请求转发(request.getRequestDispatcher().forward(request, response))的页面,直到页面跳转和重定向
              
          session:(一次会话)(一般情况下,存储和用户相关的信息)
              作用域:请求和响应
              生命周期:当发送一次请求,session就会被创建,当关闭浏览器或者关闭服务器的时候session就会被销毁
              
          pageContext:(页面的上下文)(就是当前页面)(一般情况下,存储临时变量)(不使用)
              作用域:当前页面
              生命周期:从页面访问开始到当页面跳转结束
              pageContext召唤另外八个神兽
              
           从小到大排序:
              pageContext--->request--->session--->application
              
              
          九大内置对象(内键对象):
              直接可以使用,无需创建的对象就称之为内置对象
              *request
                  请求信息
              *response
                  响应信息response.getWriter().print();
              *session
                  一次会话(一般存储用户相关的信息)
              (*)application
                  作用于整个项目
              pageContext
                  页面上下文(和页面有关的数据(临时数据))
              config(绝对不能动(当前jsp的配置信息(servlet的配置信息)))
                  配置信息
              out
                  打印的信息
              page
                  当前页面的信息
              exception:默认是隐藏的,如果需要显示< % @ page isErrorPage="true" % >
                  异常信息
              
              
              4(作用域)+2(输出)+3(打酱油)
              pageContext--request--session--application
             
         response--out
         page--config--exception
</pre> <% request.setAttribute("name", "zhangsan"); session.setAttribute("name", "lisi"); application.setAttribute("name", "wangwu"); pageContext.setAttribute("name", "zhaoliu"); // 如果使用el表达式取值的情况下,pageContext--${pageScore.property } %> ${pageScope.name } </body> </html>

 

2.计算服务器访问次数:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'app.jsp' starting page</title>


</head>

<body>

    <%
        Integer count = (Integer) application.getAttribute("count");
        if (count == null) {
            count = 1;
        } else {
            count++;
        }
        application.setAttribute("count", count);
    %>

    我一共被访问<%=application.getAttribute("count")%></body>
</html>

 

3.filter:

 

  index主页:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'index.jsp' starting page</title>
</head>
<body>
    <pre>
      
          filter:
              过滤器:通过访问路径进行拦截
              作用:防止恶意访问,未登录的情况下访问用户信息,用户订单。。
              
              生命周期:
                  当服务器(tomcat)启动的时候,就被初始化,当服务器关闭的时候会被销毁,有且只被创建一个对象(单例模式)
              
              建立Class(FilterClass)--->实现Filter接口(javax.servlet.Filter)---->重写init方法,destroy方法,doFilter方法---->在doFilter方法中chain.doFilter(request, response):当第一次被过滤后放行,在chain.doFilter()方法之后的代码会进行二次过滤
              特点:如果有多个filter同时过滤的话,正着进倒着出
              加载顺序:在web.xml中配置先后顺序进行加载
              如果一个项目有多个配置:
                  filter配置顺序:
                      首先一定要配置filter,其次配置listener(监听:监听一定要配在filter之后,servlet之前),最后配置servlet
      
      
      </pre>
</body>
</html>

 

  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_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>20170728_filter</display-name>

    <filter>
        <filter-name>shiwei</filter-name>
        <filter-class>cn.zzsxt.lee.web.filter.ShiweiFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>shiwei</filter-name>
        <!-- <url-pattern>/visitKing.huanggong</url-pattern>/*, *.xxx, /xxx, /xxx/*
        <url-pattern>/visitKing.weifusifang</url-pattern>
        <url-pattern>/visitKing.yuhuayuan</url-pattern>
        <url-pattern>/visitKing.tiantan</url-pattern> -->
        <servlet-name>king</servlet-name>
    </filter-mapping>
---------------------------------------------------------------------------------------------------------
    <filter>
        <filter-name>wuqi</filter-name>
        <filter-class>cn.zzsxt.lee.web.filter.WuqiFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>wuqi</filter-name>
        <url-pattern>/*</url-pattern>   <!-- /*, *.xxx, /xxx, /xxx/* -->
    </filter-mapping>
----------------------------------------------------------------------------------------------------------
    <filter>
        <filter-name>anqi</filter-name>
        <filter-class>cn.zzsxt.lee.web.filter.AnqiFilter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>anqi</filter-name>
        <url-pattern>*.huanggong</url-pattern>   <!-- /*, *.xxx, /xxx, /xxx/* -->访问方式
    </filter-mapping>






    <servlet>
        <servlet-name>king</servlet-name>
        <servlet-class>cn.zzsxt.lee.web.servlet.KingServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>king</servlet-name>
        <url-pattern>/visitKing.huanggong</url-pattern>
        <url-pattern>/visitKing.weifusifang</url-pattern>
        <url-pattern>/visitKing.yuhuayuan</url-pattern>
        <url-pattern>/visitKing.tiantan</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>queen</servlet-name>
        <servlet-class>cn.zzsxt.lee.web.servlet.QueenServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>queen</servlet-name>
        <url-pattern>/visitQueen.huanggong</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>nine</servlet-name>
        <servlet-class>cn.zzsxt.lee.web.servlet.NineServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>nine</servlet-name>
        <url-pattern>/visitNine.huanggong</url-pattern>
    </servlet-mapping>



    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

  Filter Class:

package cn.zzsxt.lee.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

// filter特点:过滤的时候是正着进去,倒着出来
// filter特点:根据web.xml配置的先后顺序进行加载
// filter特点:在web.xml中,首先要对filter进行配置,然后再对Listener(监听:监听一定要配置在filter之后和servlet之前)进行配置,最后对servlet进行配置
public class WuqiFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("只要你一进来,我就要检查你身上是否携带武器");
        chain.doFilter(request, response);// 如果没有这个方法,需要访问的路径就永远无法访问
        // 在chain.doFilter()以后的代码,是为了进行二次过滤
        System.out.println("你现在要出去啦,别带着宫女跑了");
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
        System.out.println("你进来了,我就要上班了");
    }

    @Override
    public void destroy() {
        System.out.println("我也很累,我需要换岗");
    }

}

  Servlet:

package cn.zzsxt.lee.web.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class KingServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("测试");
    }

}

 

4.MVC框架:

        MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。

 

  建包的结构:

 

    

 

 

 

  impl包下的实现类继承封装好的JDBC:

package cn.zzsxt.lee.web.user.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;

import cn.zzsxt.lee.web.basedao.BaseDao;
import cn.zzsxt.lee.web.user.dao.IUserDao;
import cn.zzsxt.lee.web.user.entity.User;

public class UserDaoImpl extends BaseDao implements IUserDao {

    @Override
    public User selectUserByUsernameAndPassword(User user) {
        String sql = "select * from e_user where username=? and password=?";
        String[] params = { user.getUsername(), user.getPassword() };
        ResultSet rs = super.execQuery(sql, params);
        User u = new User();
        try {
            while (rs.next()) {
                u.setId(rs.getString("id"));
                u.setUsername(rs.getString("username"));
                u.setPassword(rs.getString("password"));
                u.setRealPassword(rs.getString("real_password"));
                u.setRole(rs.getInt("role"));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return u;
    }

}

  Service实现类调用Dao实现类中的方法:

package cn.zzsxt.lee.web.user.service.impl;

import cn.zzsxt.lee.web.user.dao.IUserDao;
import cn.zzsxt.lee.web.user.dao.impl.UserDaoImpl;
import cn.zzsxt.lee.web.user.entity.User;
import cn.zzsxt.lee.web.user.service.IUserService;

public class UserServiceImpl implements IUserService {

    private IUserDao userDao = new UserDaoImpl();

    @Override
    public User selectUserByUsernameAndPassword(User user) {
        return userDao.selectUserByUsernameAndPassword(user);
    }

}

  Controller中Servlet内各种方法的封装:

package cn.zzsxt.lee.web.user.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.zzsxt.lee.web.user.entity.User;
import cn.zzsxt.lee.web.user.service.IUserService;
import cn.zzsxt.lee.web.user.service.impl.UserServiceImpl;
import cn.zzsxt.lee.web.utils.MD5;

@WebServlet("/user.sxt")
public class UserServlet extends HttpServlet {

    private IUserService userService = new UserServiceImpl();

    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String method = request.getMethod().toLowerCase();// 请求方式
        String type = request.getParameter("type");
        if ("post".equals(method) && "login".equals(type)) {
            doLogin(request, response);
        } else if ("post".equals(method) && "register".equals(type)) {
            // doRegister(request, response);
        } else if ("get".equals(method) && "logout".equals(type)) {
            doLogOut(request, response);
        }

    }

    /**
     * @description 注销功能
     * @param request
     * @param response
     * @throws IOException
     */
    private void doLogOut(HttpServletRequest request, HttpServletResponse response) throws IOException {

        User user = (User) request.getSession(false).getAttribute("user");
        if (user != null) {
            request.getSession().removeAttribute("user");
        }

        if (!"".equals(request.getSession().getAttribute("username"))
                && request.getSession().getAttribute("username") != null) {
            System.out.println("我进来了");
            request.getSession().removeAttribute("username");
            request.getSession().removeAttribute("password");
        }
        response.sendRedirect("login.jsp");// 重定向
        return;
    }

    /**
     * @description 登录功能
     * @param request
     * @param response
     * @throws IOException
     */
    private void doLogin(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("pwd");
        password = MD5.getMD5(password);
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        User u = userService.selectUserByUsernameAndPassword(user);
        if (u.getId() != null && !"".equals(u.getId())) {
            // 登录成功
            request.getSession().setAttribute("user", u);// 存入session
            Cookie nameCookie = new Cookie("username", u.getUsername());
            Cookie pwdCookie = new Cookie("password", u.getPassword());
            nameCookie.setMaxAge(60 * 60 * 24 * 30);
            pwdCookie.setMaxAge(60 * 60 * 24 * 30);
            response.addCookie(nameCookie);
            response.addCookie(pwdCookie);
            response.sendRedirect("index.jsp");
            return;
        }
    }

}

  Filter中设置编码和Cookie的获得:

package cn.zzsxt.lee.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @description 编码过滤器
 * @author Seven Lee
 * @date 2017年7月28日下午4:48:59
 *
 */
public class GlobalFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        // 如果是设置编码,就必须添加chain.doFilter();
        chain.doFilter(request, response);
        // 获取cookie数组
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {// 防止空指针
            String username = "";
            String password = "";
            for (int i = 0; i < cookies.length; i++) {
                System.out.println(cookies[i].getValue());
                if ("username".equals(cookies[i].getName())) {
                    username = cookies[i].getValue();
                }
                if ("password".equals(cookies[i].getName())) {
                    password = cookies[i].getValue();
                }
            }
            request.getSession().setAttribute("username", username);
            request.getSession().setAttribute("password", password);
        } else {
            for(int i = 0; i < cookies.length; i++){
                System.out.println(cookies[i].getValue());
            }
            response.sendRedirect("login.jsp");   重定向两次会造成500错误,请求转发两次,后端会出现错误但页面扔可以跳转
            return;
        }

    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

}

  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_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>20170728_project_final</display-name>

    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>cn.zzsxt.lee.web.filter.GlobalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>


    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

 

 5.MVC和三层架构的关系:

 

  三层架构:

  是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层)。

  三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑。

  比如将数据库操作代码封装到一层中,提供一些方法根据参数直接返回用户需要的相应数据,这样在处理具体的业务逻辑的时候,就不用关心数据的存储问题了。

 

  MVC:

  是在应用程序(BS结构)的视图层划分出来的不同功能的几个模块。

  MVC主要是为了解决应用程序用户界面的样式替换问题,把展示数据的 HTML 页面尽可能的和业务代码分离。MVC把纯净的界面展示逻辑(用户界面)独立到一些文件中(Views),把一些和用户交互的程序逻辑(Controller)单独放在一些文件中,在 Views 和 Controller 中传递数据使用一些专门封装数据的实体对象,这些对象,统称为Models。

  

  三层可以应用于任何语言、任何技术的应用程序;而MVC只是为了解决BS应用程序视图层各部分的耦合关系。它们互不冲突,可以同时存在,也可根据情况使用其中一种。

        

  三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了“高内聚,低耦合”的思想。

   1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。

   2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。

   3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。

  MVC是 Model-View-Controller,严格说这三个加起来以后才是三层架构中的UI层,也就是说,MVC把三层架构中的UI层再度进行了分化,分成了控制器、视图、实体三个部分,控制器完成页面逻辑,通过实体来与界面层完成通话;而C层直接与三层中的BLL进行对话。

 

  mvc可以是三层中的一个表现层框架,属于表现层。三层和mvc可以共存。

  三层是基于业务逻辑来分的,而mvc是基于页面来分的。

  MVC主要用于表现层,3层主要用于体系架构,3层一般是表现层、中间层、数据层,其中表现层又可以分成M、V、C,(Model View Controller)模型-视图-控制器

 

 

 

 

 

posted @ 2017-07-28 19:35  咫尺天涯是路人丶  阅读(951)  评论(1编辑  收藏  举报