JavaWeb基础—零碎的知识点

JavaBean

实体类

JavaBean有特定的写法:

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

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

ORM:对象关系映射

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

eg:

idnamescoreclass
1小a961班
2小b972班
3小c983班
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已经创建,所以会加一,一个客户端访问就会加一次,不同浏览器算作不同客户端

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值