Java速成Web开发(一)
  95G6pIbWItcH 2023年11月01日 76 0

JavaWeb

1 Servlet

1. 什么是servlet

  • 一种衔接前后端的技术,本质是一种流,底层是由网络编程编写

  • service业务逻辑

  • 从狭义上讲,servlet就是一个名字叫做servlet的接口

  • 从广义上讲,servlet就是我们自己写的一个实现servlet接口的java类,这个类的最大特点就是它能接受请求,同时可以返回响应

2 servlet类的方法

1. service()

用来接收请求,返回响应

2. 构造方法

创建一个servlet对象

3. init()

对servlet对象进行初始化

4. destroy()

销毁该servlet对象

3 核心配置文件

  • 在java web的项目中,我们需要配置web.xml的核心配置文件
<servlet>标签表示servlet,它包含了子标签
    <servlet-name>	----表示servlet的名字
    <servlet-class>	----表示servlet类的全类名
        
<servlet-mapping>标签表示和<servlet>对应的映射关系,包含子标签
    <servlet-name>	----表示servlet的名字
    <url-pattern>	----表示请求名,对应的请求到来,就会触发servlet类执行

4 url格式

http://ip地址:端口/web应用的名字/请求名
  • 其中http://ip地址:端口称为web站点的根目录
  • web站点的根目录/web应用的名字称为web应用的根目录
  • 所有请求都基于http协议
  • 现在流行https协议,更加安全

5 <load-on-startup>

  • 配置在 中,表示当前的servlet被创建和初始化的时机
  • 如果取值为非负整数,则表示随Tomcat启动进行创建和初始化
  • 注意:
    • 如果取值为负数,则等于没有配多个servlet,按照取值从小到大的顺序自动创建和加载
    • 在web.xml中,一个 可以对应多个

6 <url-pattern>通配符

  • /*

    <url-pattern>/*</url-pattern>
    
  • /

    <url-pattern>/</url-pattern>
    
  • *.后缀名

    <url-parttern>*.do</url-parttern>
    

7 ServletConfig

  • 一个servlet的大管家类,可以获取当前servlet方方面面的信息,由tomcat创建并传入init方法中,我们可以在web.xml的 中定义 表示当前servlet的初始化参数
  • 表示参数名
  • 表示参数值

1. 常用方法

  • getInitParameter(参数名)-------获取对应的参数值
  • getServletName()------获取当前servlet的名字

2. ServletContext

  • 当前Web应用的大管家,可以获取当前Web应用的方方面面的信息
  • 我们可以用ServletConfig对象的getServletContext()方法获取对象
1. 常用方法
  • getInitParameter(参数名)-------获取对应的参数值
  • getRealPath(项目结构路径)------获得该文件部署后的绝对路径
  • getContextPath()-------获取web应用的根目录,其中的/表示web站点的根目录

8 发送请求的方式

9 参数传递

1. get 请求

  • url地址中石油问号分隔web应用和参数
  • 参数格式:参数名1=参数值1&参数名2=参数值2
  • 如果是表单提交,则表单控件的name对应参数民,value对应参数值
  • 注意:get请求有长度限制,不超过1k

2. post 请求

10 接收参数

  • 在servlet的services方法中,使用ServletRequest对象调用getParameter(参数名)可以得到参数值

11 返回响应

  • 通过ServletResponse对象调用getWriter()方法获取PrintWriter打印流对象,然后由该打印流对象调用print()完成打印

  • 练习:在web.xml中配置两个web应用的初始化参数

    • username:admin
    • password:123456
    • 画一个登陆页面,请用户登录
    • 校验账号密码是否正确
    • 在结果页面上响应
      • hello:xxx
      • sorry:xxx
      • 注意:xxx为用户输入的用户名
public class login implements Servlet {

    ServletContext sc;
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        sc=servletConfig.getServletContext();
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        String username=sc.getInitParameter("username");
        String password=sc.getInitParameter("password");
        String usernameParam=servletRequest.getParameter("username");
        String passwordParam=servletRequest.getParameter("password");
        PrintWriter pw=servletResponse.getWriter();
        if(usernameParam.equals(username)&&passwordParam.equals(password))
            pw.print("hello,"+usernameParam);
        else pw.print("sorry,"+usernameParam);
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
 <context-param>
        <param-name>username</param-name>
        <param-value>admin</param-value>
    </context-param>
    <context-param>
        <param-name>password</param-name>
        <param-value>123456</param-value>
    </context-param>
    <servlet>
        <servlet-name>login</servlet-name>
        <servlet-class>com.iweb.test.login</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>login</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>用户登录</h3>
<form action="login" method="post">
    账号:<input type="text" name="username"/>
    <br>
    <br>
    密码:<input type="text" name="password"/>
    <br>
    <br>
    <input type="submit" value="登录"/>

</form>

</body>
</html>

12 HttpServletRequest

  • Tomcat在调用service方法时,实际传入的是这两个类的对象

  • 在service方法中,对HttpServletRequest和HttpServletResponse进行向下转型获得更多方法

    HttpServletRequest request=(HttpServletRequest) servletRequest;
    HttpServletResponse response=(HttpServletResponse) servletResponse;
    

1. 方法

  • getMethod()-----------获取请求方式是post还是个体、

    String method=request.getMethod();
    System.out.println(method);
    
  • getQueryString()-----------获取get请求中的参数

  • getServletPath()-----------获取当前请求中的请求名,也就是

  • getContextPath()-----------获取web应用的根目录,其中的/表示web站点的根目录

  • getServletContext()------获取SevletContext对象

13 HttpServletResponse

  • 同样可以调用getWriter(),得到PrintWriter对象向页面进行打印输出
  • 是ServletResponse对象的子类,自然可以实现父类的所有方法

2 HttpServlet

1 什么是HttpServlet

  • 已经实现了Servlet接口,我们不需要去实现接口,实际开发中直接继承这个类即可
  • 帮我们完成了参数的向下转型,并判断出了请求方式是get还是post,提供了doGet和doPost方法供我们调用,我们只需要在方法中,编写业务逻辑即可
public class TestHttpServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        System.out.println("get a getRequest!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) 
        throws ServletException, IOException {
        System.out.println("get a postRequest!");
    }
}

2 实践:login登录

  • 数据库,创建一张表,user,三个字段id,username,password

    create table `myuser`(
        `id` primary key,
        `username` not null,
        `password` not null
    )engine=InnoDB default charset=utf8;
    
  • 在表中添加几条数据

    insert into `myuser` values{'1001','张三','123456'};
    insert into `myuser` values{'1002','李四','123457'};
    insert into `myuser` values{'1003','王五','123458'};
    
  • 画前端页面

    <body>
    
    <h3>用户登录</h3>
    <form action="login2" method="post">
        账号:<input type="text" name="username"/><br><br>
        密码:<input type="text" name="password"/><br><br>
        <input type="submit" value="登录"/>
    </form>
    
    </body>
    
  • 配置xml

        <!--login2-->
        <servlet>
            <servlet-name>login2</servlet-name>
            <servlet-class>com.iweb.test.LoginHttpServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>login2</servlet-name>
            <url-pattern>/login2</url-pattern>
        </servlet-mapping>
    
  • 利用HttpServlet进行登录校验

    public class LoginHttpServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String sql = "select * from myuser where username=? and password=?";
            List<Map<String, Object>> list = JdbcUtil.queryBySql(sql);
            PrintWriter pw = resp.getWriter();
            if (list.size() > 0)
                pw.print("hello," + username);
            else pw.print("sorry,"+password);
    
        }
    }
    
  • 导入jdbc驱动依赖,并导入JdbcUtil工具类

    package com.iweb.utils;
    
    import java.sql.*;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    /**
     * Author: ChengHao Wu
     * Date: 2023/1/13 11:14
     */
    
    public class JdbcUtil {
    
        static Connection conn = null;
        static PreparedStatement preparedStatement = null;
        static ResultSet rest = null;
        static ResultSetMetaData rsmd = null;
    
        //获取数据库连接
        private static Connection getConn() {
            try {
                Class.forName("com.mysql.cj.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://192.168.77.100:3306/mysql?characterEncoding=utf-8",
                        "root", "123456");
            } catch (ClassNotFoundException | SQLException e) {
                throw new RuntimeException(e);
            }
            return conn;
        }
    
        //关闭资源
        private static void closeJdbc() {
            try {
                if (rest != null) rest.close();
                if (preparedStatement != null) preparedStatement.close();
                if (conn != null) conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);//ctr+alt+t
            }
        }
    
        //查询
        public static <E> List<Map<String, Object>> queryBySql(String sql, E... e) {
    
            List<Map<String, Object>> list = new ArrayList<>();
            conn = getConn();
            try {
                
                preparedStatement = conn.prepareStatement(sql);
    
                for (int i = 0; i < e.length; i++) {
                    preparedStatement.setObject(i + 1, e[i]);
                }
    
                rest = preparedStatement.executeQuery();
                rsmd = rest.getMetaData();
                int columnCount = rsmd.getColumnCount();
    
                while (rest.next()) {
                    Map<String, Object> map = new HashMap<>();
                    for (int i = 1; i <= columnCount; i++) {
                        map.put(rsmd.getColumnName(i), rest.getObject(i));
                    }
                    list.add(map);
                }
    
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            } finally {
                closeJdbc();
            }
            return list;
        }
    
    
        //增删改
        public static <E> int updateBySql(String sql, E... e) {
    
            conn = getConn();
            int successCount=0;
            
            try {
                preparedStatement = conn.prepareStatement(sql);
    
                for (int i = 0; i < e.length; i++) {
                    preparedStatement.setObject(i + 1, e[i]);
                }
    
               successCount=preparedStatement.executeUpdate();
    
            } catch (SQLException ex) {
                throw new RuntimeException(ex);
            } finally {
                closeJdbc();
            }
    
            return successCount;
        }
    }
    
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  2Vtxr3XfwhHq   2024年05月17日   55   0   0 Java
  Tnh5bgG19sRf   2024年05月20日   114   0   0 Java
  8s1LUHPryisj   2024年05月17日   49   0   0 Java
  aRSRdgycpgWt   2024年05月17日   47   0   0 Java
95G6pIbWItcH