Java速成Web开发(一)
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: 地址:端口/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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)