文章目录
JavaWEB
Servlet
1、概述:server applet(运行在服务器的小程序),servlet可以看做是一个接口,定义了Java类被浏览器访问Tomcat的规则
2、简单实例:
//servlet代码示例
1、创建JavaWEB或者说是JavaEE项目
2、定义一个类,实现Servlet接口
3、实现抽象接口中的抽象方法
4、配置Servlet
3、Servlet的执行原理
1、当服务器的接收到客户端的请求后,先解析URL路径,获取访问Servlet的资源路径
2、从web.xml获取url-pattern,然后寻找Servlet-class的全类名
3、Tomcat将该字节码加载到内存,并创建其对象
4、调用其方法
4、Servlet方法
1、init初始化方法,在Servlet创建时执行
2、service()提供服务的方法,每次Servlet被访问时,执行,会执行多次
3、销毁方法,destroy()方法,服务器正常关闭时,执行一次
4、Servletconfig,获取Servlet的config对象即配置对象
5、getservletInfo()用于获取Servlet信息
Servlet的生命周期
1、被创建执行init方法,只执行一次
(1)默认情况下,第一次访问时,Servlet被创建
(2)指定Servlet的创建时机,在web.xml进行配置,在Servlet的标签内配置
(3)Servlet的init方法只执行一次,说明Servlet在内存中只存在一个对象,Servlet是单例的,多个用户同时访问时,可能会出现线程访问安全问题
解决:尽量不要在Servlet中定义成员变量;
2、提供服务,执行多次的service方法
3、被销毁,执行一次,destroy方法,在Servlet销毁前执行,用于释放资源
注解方式Servlet3.0实例
@webServlet("/demo")相当于web.xml的配置
Servlet的实现类
1、Servlet–>GenericServlet—>httpservlet
2、httpServlet是Servlet的子类,对Servlet方法提供了默认的实现方法,只抽象了service()方法,我们只要实现service()方法。
1、httpservlet中service获取数据doget(){}\dopost(){}
httpservlet
1、定义类继承httpservlet
2、复写doget()或者dopost
Servlet相关配置
1、一个Servlet可以定义多个访问路径
HTTP
1、概述:Hyper text Transfer Protocal超文本传输协议
传输协议定义客户端和服务端通信时,发送数据的格式和规范
2、特点:
(1)基于TCP/IP的高级协议
(2)默认端口为80
(3)基于请求/响应模型:一一对应
(4)无状态协议,每次请求之间相互独立
3、历史版本1.0和1.1
(1)每次请求响应都会建立新的连接
(2)复用连接
4、HTTP的数据格式
(1)请求消息数据格式
- 请求行:请求方式 请求URL 请求协议(GET /login.html http/1.1)
请求方式7种:常用get、post
区别:get请求参数在请求行中,post的请求参数在请求体中 - 请求头:请求头名称:请求值
- 请求空行:空行
- 请求体:正文,放置请求参数
(2)响应消息数据格式
-
响应行
1. 组成:协议/版本 响应状态码 状态码描述
2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
1. 状态码都是3位数字
2. 分类:
1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2. 2xx:成功。代表:200
3. 3xx:重定向。代表:302(重定向),304(访问缓存)
4. 4xx:客户端错误。
* 代表:
* 404(请求路径没有对应的资源)
* 405:请求方式没有对应的doXxx方法
5. 5xx:服务器端错误。代表:500(服务器内部出现异常)2. 响应头: 1. 格式:头名称: 值 2. 常见的响应头: 1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式 2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据 * 值: * in-line:默认值,在当前页面内打开 * attachment;filename=xxx:以附件形式打开响应体。文件下载 3. 响应空行 4. 响应体:传输的数据
示例
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
<html>
<head>
<title>$Title$</title>
</head>
<body>
hello , response
</body>
</html>
Request
1、request对象和response对象原理
2、request对象是来获取请求消息,response对象是用于设置响应消息
3、方法:
- 获取请求方式 :String getMethod()
2. ()获取虚拟目录: String getContextPath()
3. 获取Servlet路径: String getServletPath()
4. 获取get方式请求参数:String getQueryString()
5. ()获取请求URI:
*String getRequestURI():
* StringBuffer getRequestURL() :http://localhost/day14/demo1
* URL:统一资源定位符 : http://localhost/day14/demo1
* URI:统一资源标识符 : /day14/demo1
6. 获取协议及版本:HTTP/1.1
* String getProtocol()
7. 获取客户机的IP地址:
* String getRemoteAddr()-
获取请求头数据
* 方法:
* (*)String getHeader(String name):通过请求头的名称获取请求头的值
* Enumeration getHeaderNames():获取所有的请求头名称3. 获取请求体数据: * 请求体:只有POST请求方式,才有请求体,在请求体中封装了POST请求的请求参数 * 步骤: 1. 获取流对象 * BufferedReader getReader():获取字符输入流,只能操作字符数据 * ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据 * 在文件上传知识点后讲解 2. 再从流对象中拿数据
- 其他功能:
-
获取请求参数通用方式:不论get还是post请求方式都可以使用下列方法来获取请求参数
- String getParameter(String name):根据参数名称获取参数值 username=zs&password=123
- String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobby=xx&hobby=game
- Enumeration getParameterNames():获取所有请求的参数名称
- Map<String,String[]> getParameterMap():获取所有参数的map集合
- 中文乱码问题:
- get方式:tomcat 8 已经将get方式乱码问题解决了
- post方式:会乱码
- 解决:在获取参数前,设置request的编码request.setCharacterEncoding(“utf-8”);
-
请求转发:一种在服务器内部的资源跳转方式
-
步骤:
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response)
-
特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器内部资源中。
- 转发是一次请求
-
-
共享数据:
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttitude(String name):通过键获取值
- void removeAttribute(String name):通过键移除键值对
-
获取ServletContext:
- ServletContext getServletContext()
-
- 其他功能:
-
登录实例
1、数据库
CREATE DATABASE day14;
USE day14;
CREATE TABLE USER(
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(32) UNIQUE NOT NULL,
PASSWORD VARCHAR(32) NOT NULL
);
2、实体类:
public class User {
private int id;
private String username;
private String password;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}
3、JDBC工具类
package cn.itcast.util;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import javax.xml.crypto.Data;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
/**
* JDBC工具类 使用Durid连接池
*/
public class JDBCUtils {
private static DataSource ds ;
static {
try {
//1.加载配置文件
Properties pro = new Properties();
//使用ClassLoader加载配置文件,获取字节输入流
InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//2.初始化连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取连接池对象
*/
public static DataSource getDataSource(){
return ds;
}
/**
* 获取连接Connection对象
*/
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
4、user.dao
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* 操作数据库中User表的类
*/
public class UserDao {
//声明JDBCTemplate对象共用
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
/**
* 登录方法
* @param loginUser 只有用户名和密码
* @return user包含用户全部数据,没有查询到,返回null
*/
public User login(User loginUser){
try {
//1.编写sql
String sql = "select * from user where username = ? and password = ?";
//2.调用query方法
User user = template.queryForObject(sql,
new BeanPropertyRowMapper<User>(User.class),
loginUser.getUsername(), loginUser.getPassword());
return user;
} catch (DataAccessException e) {
e.printStackTrace();//记录日志
return null;
}
}
}
servlet类
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.设置编码
req.setCharacterEncoding("utf-8");
//2.获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//3.封装user对象
User loginUser = new User();
loginUser.setUsername(username);
loginUser.setPassword(password);
//4.调用UserDao的login方法
UserDao dao = new UserDao();
User user = dao.login(loginUser);
//5.判断user
if(user == null){
//登录失败
req.getRequestDispatcher("/failServlet").forward(req,resp);
}else{
//登录成功
//存储数据
req.setAttribute("user",user);
//转发
req.getRequestDispatcher("/successServlet").forward(req,resp);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
@WebServlet("/successServlet")
public class SuccessServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取request域中共享的user对象
User user = (User) request.getAttribute("user");
if(user != null){
//给页面写一句话
//设置编码
response.setContentType("text/html;charset=utf-8");
//输出
response.getWriter().write("登录成功!"+user.getUsername()+",欢迎您");
}
}
失败Servlet
@WebServlet("/failServlet")
public class FailServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//给页面写一句话
//设置编码
response.setContentType("text/html;charset=utf-8");
//输出
response.getWriter().write("登录失败,用户名或密码错误");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
response
- 功能:设置响应消息
1. 设置响应行
1. 格式:HTTP/1.1 200 ok
2. 设置状态码:setStatus(int sc)
2. 设置响应头:setHeader(String name, String value)
3. 设置响应体:
* 使用步骤:
1. 获取输出流- 字符输出流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
- 使用输出流,将数据输出到客户端浏览器