JavaWeb基础学习

JavaWeb基础

web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <servlet>
        <servlet-name>servlet_all</servlet-name>
        <servlet-class>com.example.servlet_study.servlet_all</servlet-class>
        <init-param>
            <param-name>default-time</param-name>
            <param-value>50</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>servlet_all</servlet-name>
        <url-pattern>/servlet_all</url-pattern>
    </servlet-mapping>


    <context-param>
        <param-name>encoding</param-name>
        <param-value>GBK</param-value>
    </context-param>

    <session-config>
        <session-timeout>10</session-timeout>
    </session-config>

    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.example.servlet_study.filter</filter-class>
    </filter>

    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/servlet_all</url-pattern>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>


</web-app>

servlet文件

package com.example.servlet_study;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.Enumeration;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import javax.sql.DataSource;


@WebServlet(name="servlet_all", urlPatterns="/servlet_all",
initParams = {@WebInitParam(name = "encoding",value = "UTF-8"),
@WebInitParam(name="textType",value = "text/html;charset=utf-8"),
@WebInitParam(name="resencoding",value = "GBK")})
public class servlet_all extends HttpServlet {


    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //HTTP响应状态码
        //1、200  客户端响应成功
        //2、302  临时重定向  服务器返回的头部信息中会包含一个 Location 字段,内容是重定向到的url
        //3、400  客户端请求有语法错误,不被服务器端理解
        //4、401  请求未经授权,必须和WWW-Authenticate报头域一起使用
        //5、403  服务器收到请求,但拒绝提供服务
        //6、404  请求资源不存在
        //7、500  服务器发生不可预期的错误
        //8、503  服务器当前不能处理客户端的请求


//        get与post请求的区别有哪些
//        区别一:
//        get重点在从服务器上获取资源
//        post重点在向服务器发送数据
//        区别二:
//        get传输数据是通过URL请求,以field(字段)= value的形式,置于URL后,并用"?"连接,多个请求数据间用"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是可见的
//        post传输数据通过Http的post机制,将字段与对应值封存在请求实体中发送给服务器,这个过程对用户是不可见的
//        区别三:
//        Get传输的数据量小,因为受URL长度限制,但效率较高
//        Post可以传输大量数据,所以上传文件时只能用Post方式
//        区别四:
//        get是不安全的,因为URL是可见的,可能会泄露私密信息,如密码等
//        post较get安全性较高


//        简单描述Servlet生命周期
//        加载Servlet:当Tomcat第一次访问Servlet的时候,Tomcat会负责创建Servlet的实例
//        初始化:当Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
//        处理服务:当浏览器访问Servlet的时候,Servlet 会调用service()方法处理请求
//        销毁:当Tomcat关闭时或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,让该实例释放掉所占的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁
//        卸载:当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作

        //实现servlet的方法:
        //实现Servlet接口:init()(只执行一次);service();destroy()(只执行一次),getServletConfig(),getServletInfo();
        //继承GenericServlet类:destroy(),init(),init(ServletConfig config),service()
        //继承HttpServlet类(常用):init(),doGet(),doPost(),destroy()方法
        String encoding=this.getServletConfig().getInitParameter("encoding");//通过ServletConfig获取初始参数
        System.out.println("init-param:encoding="+encoding);
        String info=this.getServletInfo();
        System.out.println("ServletConfig:"+info);//获取servlet信息,默认为空
        //四大域 Request Page Session application

        System.out.println("*******Request常用方法*****");
        request.setCharacterEncoding(encoding);//设置request编码,解决页面传参为中文问题
        StringBuffer url=request.getRequestURL();//获取请求地址
        String uri= request.getRequestURI();//获取URI,URL去掉主机地址
        System.out.println("URL:"+url);
        System.out.println("URI:"+uri);
        String name=request.getParameter("name");//通过参数名获取客户端传递的参数,url传参数可用?参数1=参数值&参数2=参数值
        System.out.println("客户端参数:name="+name);
        String contextPath=request.getContextPath();//获取上下文路径
        System.out.println("ContextPath:"+contextPath);
        String[] values=request.getParameterValues("ball");//获取请求参数中的复选框值
        System.out.print("复选选项:");
        if(values!=null){//如果不判断,可能会报空指针错误
        for(String i:values){//循环打印复选框值
            System.out.print(i+"   ");
        }
        }
        System.out.println();
        request.setAttribute("time",100);//request设置变量
        int time=(int) request.getAttribute("time");
        System.out.println("request设置的变量time:"+time);
//        request.getRequestDispatcher("转发地址").forward(request,response);//请求转发,转发时可以通过setAttribute()传递参数信息

        System.out.println("****Response****");
        String text=this.getInitParameter("textType");
        response.setContentType(text);//使客户端浏览器,区分不同种类的数据
        response.setCharacterEncoding(this.getServletConfig().getServletContext().getInitParameter("encoding"));//设置响应编码
        PrintWriter out=response.getWriter();//页面输出对象
        out.println(name+"欢迎进入后端的大门!");
//        response.sendRedirect("重定向地址"+"?参数1名=参数值&参数2=参数值");//重定向,通过重写url地址实现传参


        System.out.println("*****ServletConfig*****");
        ServletConfig config=this.getServletConfig();//获取ServletConfig对象
        String textType=config.getInitParameter("textType");//通过ServletConfig获取初始参数
        System.out.println("textType:"+textType);
        String servletname=config.getServletName();
        System.out.println("ServletName:"+servletname);
        Enumeration<String> inits=config.getInitParameterNames();//获取所有初始化参数名称,返回值为Enumeration对象
        while(inits.hasMoreElements()){
            System.out.print(inits.nextElement()+"  ");
        }
        System.out.println();


        System.out.println("*****ServletContext*****");
        //WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用,当前应用下的所有servlet都可以访问其参数
        ServletContext application=this.getServletContext();//利用GenericServlet.getServletContext()获取
        ServletContext application1=this.getServletConfig().getServletContext();//利用ServletConfig.getServletContext()获取
        //HttpSession session=request.getSession();//获取Session
        HttpSession session=request.getSession(true);//填写参数为true则表示没有则创建,注意session的类为HttpSession
        ServletContext  application2=session.getServletContext();//利用Session.getServletConfig()获取
        //application可以获取全局变量,全局变量在web.xml中设置,使用
        // <context-param>
        //        <param-name>time</param-name>
        //        <param-value>100</param-value>
        //</context-param>
        String contextencoding=application.getInitParameter("encoding");
        System.out.println("ContextEncoding参数:"+contextencoding);
        //ServletContext操作数据
        //void setAttribute()
        //object getAttribute()
        //void removeAttribute()
        //Enumeration getAttributeNames()
//        response.setHeader("Refresh","3;url=http://www.bilibili.com");//实现自动跳转到指定页面


        System.out.println("****Cookie&&Session****");
//        为了跟踪客户状态,Web服务器通常提供了四种方式:
//        HTML表单中隐藏数据(CourseEX09/hidden.html+GetHiddenInfo.java )
//        重写URL( CourseEX09/EncodeURL.java+RewriteServlet.java)
//        Cookie:辨别用户身份而储存在浏览器上的文本信息
//        Session:使用 HttpSession 对象保存单个用户访问时的信息

        Cookie cookie=new Cookie("test","1");//创建一个新的cookie对象
        cookie.setPath("/");//将Path设置为“/”可以使cookie能被多个web项目共享
        cookie.setValue("2");//更改cookie的值
//        cookie.setMaxAge(10);//设置cookie的有效秒数,设置为0表示立即删除,默认值为-1
//        跨域共享cookie的方法:设置cookie.setDomain("域名");
        response.addCookie(cookie);//向客户端发送cookie
        Cookie[]  cookies=request.getCookies();
        for (Cookie s:cookies) {
            System.out.println("cookie名称:"+s.getName()+"     cookie的值:"+s.getValue());
        }
        //Session 来自HttpSession类,通过request.getSession()获取,Session 有效时长默认为30分钟
        String ID=session.getId();//获取session的ID,session通过Cookie技术存储在客户端
        System.out.println("SessionID:"+ID);
//        session.setMaxInactiveInterval(10);//设置session的失效时间,单位为分钟
//        session.invalidate();//使session立即失效
        session.setAttribute("sessiontest","test");//利用session存储对象
        String s=(String) session.getAttribute("sessiontest");
        System.out.println(s);
        //可以在web.xml文件中设置session的默认失效时间

        //****JavaBean****
//        使用get和set方法定义属性;(注意:属性其实是通过set和get方法定义的)
//        一个无参构造方法;
//        Private的实例变量;
//        Public的getter和setter

        System.out.println("****JDBC****");
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");//加载驱动
            Connection conn= DriverManager.getConnection("jdbc:mysql://localhost:3306/users","root","123456");//建立连接
            PreparedStatement ps=conn.prepareStatement("select * from users where username=?");//创建sql语句
            //PrepareStatement继承自Statement类,但PrepareStatement可以防止sql注入,且PrepareStatement有预编译
            ps.setString(1,"xs");//设置参数
            ResultSet rs=ps.executeQuery();//执行sql语句,返回执行结果
            //不同执行语句的区别
//            execute()方法:用来执行返回多个结果集的sql语句
//            executeQuery()方法:用于产生单个结果集的语句
//            executeUpdate():用于执行 INSERT、UPDATE 、 DELETE 语句或不返回任何内容的 SQL 语句
            while(rs.next()){
                System.out.println(rs.getString("id")+"   "+rs.getString("username")+"  "+rs.getString("pswd"));
            }
            conn.close();
            ps.close();
            rs.close();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        DataSource ds=null;
        System.out.println("****Tomcat数据源使用****");
        try{
            Context initctx=new InitialContext();
            Context envctx=(Context) initctx.lookup("java:comp/env");
            ds=(DataSource) envctx.lookup("Tomcat");
            Connection coon=ds.getConnection();
            String sql="select * from users";
            PreparedStatement ps=coon.prepareStatement(sql);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                System.out.println(rs.getString("id")+"   "+rs.getString("username")+"   ");
            }
            coon.close();
            ps.close();
            rs.close();
        }catch (Exception e){
            e.printStackTrace();
        }


    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);

    }

}


Filter文件

package com.example.servlet_study;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter(filterName = "filter",urlPatterns ={ "/servlet_all"}
        ,initParams = {
        @WebInitParam(name="encoding",value = "utf-8"),
        @WebInitParam(name="boss",value = "ljk,xs")
})//注册过滤器:name 为过滤器名字  urlPatterns为过滤的请求路径
//在web.xml中注册Filter可以选择在filter-mapping中声明dispatcher,用以声明触发方式,默认为REQUEST;还可以是INCLUDE,FORWARD,ERROR
public class filter implements Filter {
    FilterConfig config=null;
    private  String[] booslist;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
            this.config=filterConfig;//获取FilterConfig对象,便于后面使用
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        String use=servletRequest.getParameter("name");
        String boss=config.getInitParameter("boss");
        booslist=boss.split(",");
        if (!check(use)){
            filterChain.doFilter(servletRequest,servletResponse);
        }
        else{
            HttpServletResponse response=(HttpServletResponse) servletResponse;
            servletRequest.getRequestDispatcher("./boss.jsp").forward(servletRequest,response);
        }
    }

    public boolean check(String use){
        for (String user:booslist){
            if (user.equals(use)){
                return true;
            }
        }
        return false;
    }

    @Override
    public void destroy() {
        Filter.super.destroy();
    }
}

Listener文件

package com.example.servlet_study;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener//注解声明监听器直接使用@WebListener
//监听接口的分类
//ServletContext
//ServletRequest
//HttpSession
//ServletContext:创建与销毁、属性的更改(常用于全局域对象)
//HttpSession:创建与销毁、属性的更改、绑定和激活事件(常用于记录访问人数和访问日志)
//ServletRequest:创建与销毁、属性的更改(常用于读取参数和记录访问历史)
//八个监听器
//ServletContextListener
//HttpSessionListener
//ServletRequestListener
//ServletContextAttributeListener
//ServletRequestAttributeListener
//HttpSessionAttributeListener
//HttpSessionBindingListener(绑定,解除绑定)
//HttpSessionActivationListener(钝化,活化)


//六个Event类别
//ServletContextEvent
//ServletContextAttributeEvent
//HttpSessionBindingEvent
//HttpSessionEvent
//RequestEvent
//HttpSessionBindingEvent

//接口方法
//contextInitialized()
//contextDestroyed()
//sessionCreated()
//sessionDestroyed()
//attributeAdded()
//attributeRemoved()
//attributeReplaced()
//requestInitialized()
//requestDestroy()
//valueBound()
//valueUnbound()
//sessionDidActivate()
//sessionWillPassivate()
public class ContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("Context对象被创建了!");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        System.out.println("Context对象销毁");
    }

}

JSP文件

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2021/10/29
  Time: 21:21
  To change this template use File | Settings | File Templates.
--%>
<%@ page import="java.util.*" language="java" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Servlet_all.jsp</title>
</head>
<body>
   <form action="./servlet_all" method="get">
    姓名:<input type="text" name="name"><br>
    密码:<input type="password" name="pswd"><br>
    兴趣爱好:<br>
       <input type="checkbox" name="ball" value="足球">足球
       <input type="checkbox" name="ball" value="篮球">篮球
       <input type="checkbox" name="ball" value="羽毛球">羽毛球
       <input type="checkbox" name="ball" value="网球">网球<br>
       <input type="submit" value="提交"><input type="reset" value="重置">
   </form>

    <hr>
   <p>JSP编程</p>

</body>
</html>

context.xml

<Context path="/demo_jndi" docBase="/demo_jndi">
           <Resource
             name="jndi/mybatis"
             type="javax.sql.DataSource"
             driverClassName="com.mysql.jdbc.Driver"
             maxIdle="2"
             maxWait="5000"
             username="root"
             password="123456"
             url="jdbc:mysql://localhost:3306/appdb"
             maxActive="4"/>
        </Context>

JavaWeb实现验证码功能

package com.example.ex8;

import javax.imageio.ImageIO;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;

@WebServlet(name = "GenerateCodeServlet",urlPatterns = "/GenerateCodeServlet")
public class GenerateCodeServlet extends HttpServlet {

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HttpSession session= request.getSession(true);
        int width=80,height=20,code_len=4;
        BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);

        Graphics g=image.createGraphics();
        g.setColor(new Color(200,200,200));
        g.fillRect(0,0,width,height);
        char[] codeChar="ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
        String temp = "";
        Random random = new Random();
        for (int i=0;i<code_len;i++){
            int index=random.nextInt(codeChar.length);
            g.setColor(Color.black);
            g.setFont(new Font("Times New Roman",Font.PLAIN,18));
            temp+=codeChar[index];
            g.drawString(temp,10,17);

        }
        System.out.println(temp);
        session.setAttribute("randStr",temp);

        ImageIO.write(image,"jpg",response.getOutputStream());

    }
    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
      doGet(request,response);
    }
}

<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
    <title>Login.jsp</title>
</head>
<body>
<h3>用户登录</h3>
<form method="post" action="${pageContext.request.contextPath}/validateServlet">
用户名:<input type="text" name="username"><br/>
密码: <input type="password" name="password"><br/>
验证码:<input type="text" name="code"><br/>
<img id="codeImg" alt="这是验证码" src="${pageContext.request.contextPath}/GenerateCodeServlet"><br/>
    <a href="javaScript:change();">换一张</a><br/><br/>
    <input type="submit" value="登录"/>
</form>

<script>
    function change(){
        var t=new Date();
        document.getElementById("codeImg").src="${pageContext.request.contextPath}/GenerateCodeServlet?time="+t;
    }
</script>
</body>
</html>

JavaWeb中html页面经过过滤器过滤后出现中文乱码,设置编码等方法无法正常显示时可以尝试将html页面的utf-8编码改为GBK编码。

在idea中修改html代码后页面还是与预期不符,chrome浏览器中可以使用shift+F5/ctrl+F5进行刷新尝试

posted @ 2021-10-30 22:06  浮生阁阁主  阅读(36)  评论(0)    收藏  举报