JavaWeb基础—零碎的知识点

导读:本篇文章讲解 JavaWeb基础—零碎的知识点,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

JavaBean

实体类

JavaBean有特定的写法:

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

一般用来和数据库的字段作映射 ORM:

ORM:对象关系映射

  • 表->类
  • 字段->属性
  • 行记录->对象

eg:

id name score class
1 小a 96 1班
2 小b 97 2班
3 小c 98 3班
class people{
    private int id;
    private String name;
    private int id;
    private String address
}

class A{
    new people(1,"小a",96,1);
    ...
}

MVC三层架构

基本概念:Model view Controller 模型、视图、控制器

1.早些年的架构

在这里插入图片描述

用户直接访问控制层,控制层就可以直接操作数据库

servlet-->CRUD-->数据库
弊端:程序不利于维护
servlet代码里面又有处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码

架构:

2.MVC三层架构

在这里插入图片描述

Model

  • 业务处理:业务逻辑(service)
  • 数据持久层:CRUD(Dao)

View

  • 展示数据
  • 提供链接发起Servlet请求(form、img…)

Controller(Servlet)

  • 接收用户的请求:(req:请求参数、Session信息…)
  • 交给业务层处理对应的代码
  • 控制视图跳转
登录——>接收用户的登录请求——>处理用户请求(获取登录用户的参数,username,password)——>
交给业务层处理登录业务(判断用户名密码是否正确)-->Dao层查询用户名和密码是否正确-->数据库

Filter(重要)

基本概念:过滤器,用来过滤网站的数据:

  • 处理中文乱码
  • 登录验证…

Filter步骤:

  1. 导包

在这里插入图片描述

  1. 编写过滤器

    实现filter接口,重写对应的方法

    import javax.servlet.*;
    import java.io.IOException;
    
    public class CharacterEncodingFilter implements Filter {
    
        //初始化:web服务器启动就会初始化,随时等待过滤对象的出现
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("中文乱码过滤器初始化");
        }
    
    
        //chain:链
        /*
        * 1.过滤中的所有代码,在过滤特地的请求的时候就会执行
        * 2.必须要让过滤器继续同行*/
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletRequest.setCharacterEncoding("utf-8");
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html;charset=utf-8");
            System.out.println("过滤器执行前");
            filterChain.doFilter(servletRequest,servletResponse);//让请求继续走,如果不写程序就到这停止
            System.out.println("过滤器执行后");
        }
    
        //销毁
        @Override
        public void destroy() {
            System.out.
                println("中文乱码过滤器销毁");
        }
    }
    
  2. 在web.xml中配置Filter

    <filter>
        <filter-name>filter01</filter-name>
        <filter-class>filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter01</filter-name>
<!--        只要是/servlet后的如何请求,会经过逐个过滤器-->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

下面是对随意一个servlet进行测试,servlet-mapping映射有两个路径,一个**/servlet/show**,一个**/show**:

当输入路径为/show时:

在这里插入图片描述

当输入路径为/servlet/show时:

在这里插入图片描述

Filter实现权限拦截

前言:做一个登录页面

login.jsp登录页面(用表单来实现):

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--注意这个action里面的路径要和登录的servlet的映射路径一致--%>
<form action="/servlet/login" method="post">
    <input type="text" name="username">
    <input type="submit">
</form>
</body>
</html>

LoginServlet实现登录的servlet:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获取前端请求的参数
    String username = req.getParameter("username");

    if(username.equals("admin")){//登录成功
       req.getSession().setAttribute("USER_SESSION",req.getSession().getId());
       resp.sendRedirect("/sys/success.jsp");
    }else{
        //登录失败
        resp.sendRedirect("/error.jsp");
    }
}

error.jsp如果登录失败则显示错误页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>没有权限</h1>
<a href="/login.jsp">返回登录页面</a>
</body>
</html>

success.jsp登录成功的页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<h1>进入主页</h1>

<%--页面跳转--%>
<p><a href="/servlet/logout">注销</a></p>
</body>
</html>

LoginOut当登录成功后想要注销登录:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    Object user_session = req.getSession().getAttribute("USER_SESSION");
    if(user_session != null){//说明现在是登录状态,user_session的值是那个常量
        req.getSession().removeAttribute("USER_SESSION");
        resp.sendRedirect("/login.jsp");
    }else{
        resp.sendRedirect("/login.jsp");
    }
}

要想在进入主页的时候判断用户是否登录,则要用到过滤器:

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

    //因为像方法传进来的参数的的请求和响应没有getsessiond()这个方法,所以需要强转化为HttpServletRequest
    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    Object user_session = request.getSession().getAttribute("USER_SESSION");

    if(request.getSession().getAttribute("USER_SESSION") ==null){
        response.sendRedirect("/error.jsp");
    }

    //确保代码能够继续运行
    filterChain.doFilter(servletRequest, servletResponse);
}

注:如果测试的时候,出现404这种报错:

在这里插入图片描述

可以检查上面的路径是否正确,路径是要按照tomcat的部署路径来写的:

在这里插入图片描述

监听器

实现一个监听器的接口

  1. 编写一个监听器

    实现监听器接口

    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    //统计网站在线人数,统计session
    public class OnlineCount implements HttpSessionListener {
    //    创建session的监听
        @Override
        public void sessionCreated(HttpSessionEvent httpSessionEvent) {
            ServletContext context = httpSessionEvent.getSession().getServletContext();
            Integer onlinecount = (Integer) context.getAttribute("onlinecount");
            if(onlinecount==null){
                //说明是第一个用户
                onlinecount = new Integer(1);
            }else {
                int count = onlinecount.intValue();//将自己赋值给count
                onlinecount = new Integer(count+1);
            }
    
            context.setAttribute("onlinecount",onlinecount);
    
        }
    //销毁session的监听
        @Override
        public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
            ServletContext context = httpSessionEvent.getSession().getServletContext();
            Integer onlinecount = (Integer) context.getAttribute("onlinecount");
            if(onlinecount==null){
                //说明是第一个用户
                onlinecount = new Integer(0);
            }else {
                int count = onlinecount.intValue();//将自己赋值给count
                onlinecount = new Integer(count-1);
            }
    
            context.setAttribute("onlinecount",onlinecount);
    
        }
        
        /*
        * session销毁
        * 1.手动销毁:getSession().invalidate();
        * 2.自动销毁*/
    }
    
  2. 配置监听器,在web.xml中注册监听器

<!--    注册监听器-->
    <listener>
        <listener-class>listener.OnlineCount</listener-class>
    </listener>

测试:

在index.jsp中获取监听器参数:

<h1>当前有<span><%=this.getServletConfig().getServletContext().getAttribute("onlinecount")%></span>人在线</h1>

点击启动tomcat

在这里插入图片描述

注:有2个是因为链接服务器的时候有可能失败了,但是session已经创建,所以会加一,一个客户端访问就会加一次,不同浏览器算作不同客户端

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84181.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!