【狂神说Java】JavaWeb入门到实战:过滤器,监听器,MVC拦截器,Servlet,注解配置和XML配置,SpringBoot Java注解配置,Tomcat配置运行Java Enterpris

Filter

Filter:过滤器,用来过滤网站的数据;

  • 处理中文乱码1
  • 登录验证…
  • 过滤 敏感词

项目初始化

  1. 新建 Maven项目,idea打开后,选择项目最外层,选择 添加框架支持——web应用程序 版本4.0,创建web.xml

    1. 这种测试不行,所有配置,找不到 对应的 servlet 和 filter
  2. 新建 Java Enterprise,

    1. 模板为 Web 应用程序
    2. 应用程序服务器为 tomcat 9.0.24
      1. 项目导入了如下包,可以使用注解
    3. 下一步 选择时 添加上 servlet
  3. 目录结构为:src/main

    1. 下有 webapp 注意不加s
    2. java.com.xxx
  4. 文件——项目结构——项目设置

    1. 项目——项目编译输出——demo3\out
    2. 模块 demo3
      1. deom3 的 根目录 选到 demo3
      2. 源文件夹:src\main\java
        1. 测试文件夹:src\test\java
      3. 资源文件夹:src\main\resources
        1. 测试资源文件夹 src\test\resouces
      4. 排除的文件夹:target
      5. 路径,使用模块编译输出路径
        1. \demo3\target\classes
        2. \demo3\target\test-classes
      6. 依赖全部都有
    3. Web
      1. Web部署描述符 \demo3\src\main\webapp\WEB-INF\web.xml
      2. Web资源目录 \demo3\src\main\webapp
      3. 源根 \src\main\java 和 \src\main\resources
    4. 库 所有的jar包都在,src 和 javaDoc 不用管
    5. Facet 和 上面 Web 设置一样。 Web部署描述符 等等
    6. 工作:有demo3:war 输出\demo3\target 归档类型
      1. demo3:war exploded 输出\demo3\target\demo3-1.0-SNAPSHOT 展开型
  5. 计算把 1 种的调整成 这样的格式,依然不能运行。

Java Enterprise
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>
        <junit.version>5.7.1</junit.version>
    </properties>

    <dependencies>
        
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
        
        
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build> 
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.3.1</version>
            </plugin>
        </plugins>
    </build>
其他知识 配置文件不打包
    <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-api太老了
        <!--servlet 依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <!--JSP 依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
        </dependency>
        <!--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>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
创建 servlet
//HttpServlet implements Servlet
public class ShowServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //super.doGet(req, resp);
        //不指定编码,会发生乱码
        //resp.setCharacterEncoding("utf-8");
        resp.getWriter().write("你好呀,世界");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
    }
}
配置 web.xml
  • 在当前项目,web——WEB-INF——web.xml下
<web-app>

    <servlet>
        <servlet-name>ShowServlet</servlet-name>
        <servlet-class>com.kuang.ShowServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/servlet/show</url-pattern>
    </servlet-mapping>
</web-app>
import javax.servlet.annotation.*;

@WebServlet(name = "showServlet",value = "/show")
public class ShowServlet extends HttpServlet {
	//另一种使用,没有找到这个注解
    //import javax.servlet.annotation.WebServlet;
    //在 javax.servlet-api 4.0.1包
}

配置过滤器

// @WebFilter
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化了");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=UTF-8");
        //放行
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        System.out.println("销毁了");
    }
}
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
Spring boot配置过滤器
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<Filter> baseFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(new MyCharacterEncodingFilter());
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("/*");
        filterRegistrationBean.setUrlPatterns(arrayList);
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
}

用户登录

编写登录和注销的 servlet
public class LoginServlet extends HttpServlet {

    @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());

            /*Object user_session = req.getSession().getAttribute("user_session");
            if (user_session!=null){
                req.getSession().removeAttribute("user_session");
                resp.sendRedirect("/Login.jsp");
            }else {
                resp.sendRedirect("/Login.jsp");
            }*/

            resp.sendRedirect("/sys/success.jsp");
        } else {
            resp.sendRedirect("/error.jsp");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}
登录页面
<form action="/servlet/login" method="post">
    <input type="text" name="username">
    <input type="submit">
</form>
编写配置过滤器
public class SysFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse rep, FilterChain chain) throws IOException, ServletException {
        //为了 拿到 session,向下转型。
        HttpServletRequest request1 = (HttpServletRequest) req;
        HttpServletResponse response1 = (HttpServletResponse) rep;

        if (request1.getSession().getAttribute("user_session") == null) {
            ((HttpServletResponse) rep).sendRedirect("/error.jsp");
            //response1.sendRedirect("/error.jsp"); 这种写法错误 
            //Cannot call sendError() after the response has been committed
        }

        chain.doFilter(req, rep);
    }

    @Override
    public void destroy() {
    }
}
    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.kuang.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/sys/*</url-pattern>
    </filter-mapping>

监听器

public class OnlineCountListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        //也可以作为web应用的全局变量被所有Servlet和JSPs访问
        //每一个web工程都只有一个ServletContext对象
        ServletContext ctx = se.getSession().getServletContext();

        //session销毁:1,手动销毁。2,配置过期时间。
        se.getSession().invalidate();

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount == null) {
            onlineCount = 1;
        } else {
            onlineCount++;
        }
        ctx.setAttribute("OnlineCount", onlineCount);



    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {

        ServletContext ctx = se.getSession().getServletContext();

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");

        if (onlineCount == null) {
            onlineCount = 0;
        } else {
            onlineCount--;
        }
        ctx.setAttribute("OnlineCount", onlineCount);
    }
}
    <listener>
        <listener-class>com.kuang.listener.OnlineCountListener</listener-class>
    </listener>
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>
  • jsp中 获取 ServletContext
    <%= this.getServletConfig().getServletContext().getAttribute("OnlineCount") %>

Spring boot拦截器(Mvc)

https://blog.csdn.net/someday____/article/details/126308356

创建

public class MyInterceptor implements HandlerInterceptor {// 实现HandlerInterceptor接口

    /**
     * 访问控制器方法前执行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
        return true;
    }

    /**
     * 访问控制器方法后执行。就是controller方法走完。
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
    }

    /**
     * postHandle方法执行完成后执行,一般用于释放资源。
     * 调用前提:preHandle返回true
     * 调用时间:DispatcherServlet进行视图的渲染之后
     * 多用于清理资源
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
    }
}

配置

@Configuration
public class WebConfig implements WebMvcConfigurer {
    /**
     * 添加Web项目的拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 对所有访问路径,都通过MyInterceptor类型的拦截器进行拦截
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
                .excludePathPatterns("/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
        //放行登录页,登陆操作,静态资源
    }
}

tomcat

请你谈谈网站是如何进行访问的!1.输入一个域名;回车
⒉.检查本机的C:\Windows\System32\drivers\etc\hosts 配置文件下有没有这个域名映射;
1.有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
127.0.0.1
www. qinjiang.com
2.没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值