文章目录
HttpServletResponse
HttpServletRequest和HttpServletResponse对象是ServletRequest和ServletResponse接口的子类接口,在请求servlet时候由tomcat容器来创建的,请求的时候Tomcat会把这两个对象创建出来,并给servlet 设置为参数。
注意:所有的servlet 都会有一组请求与响应的对象
HttpServletResponse作用:
可以来操作http的响应头,响应体 响应行,支持http协议,其父类不支持
HttpServletResponse操作响应行:
响应行包含 协议(以及协议的版本) 状态秒 ,描述信息等
响应消息:服务器端发送给客户端的数据
响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
注:游览器会根据服务端返回的状态码进行相应的操作,
返回404状态码会默认报路径错误终止程序,
返回200状态码会代表请求成功游览器会进行下一步操作,程序进一步执行
常见的状态码:
404路径找不到
302 重定向
304 数据缓存(使用get重复提交才会出现)
500 服务器发生错误
200 请求成功
HttpServletResponse设置其状态码的方法
resp.setStatus(“传输传递的是状态码”)
resp.sendError(“第一个参数传的是状态,码”,“提示信息”);
//HttpServletResponse操作响应行
//游览器会根据服务端返回的状态码进行相应的操作,
// 404会默认报路径错误终止程序,
// 200会代表请求成功游览器会进行下一步操作,程序进一步执行
//设置其状态码
resp.setStatus(200);
//设置状态码 以及其异常
resp.sendError(404,"您好,别瞎请求");
HttpServletResponse 来操作器响应头
响应头:
1. 格式:头名称: 值
2. 常见的响应头:
1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
* 值:
* in-line:默认值,在当前页面内打开
* attachment;filename=xxx:以附件形式打开响应体。文件下载
resp.setHeader(“Content-Type”,“jpg”); 设置响应头的格式
响应体:传输的数据
----------------------------实现文件的压缩--------------------------------------------------
resp.setHeader("refresh","2;index.jsp");
resp.sendRedirect("index.jsp");
String str="hhdhejrehrhrrhrgegehehehekejehehrhrhrhrrrbbfbfbfbffn";
//获取这个字符串的字节大小
System.out.println(str.getBytes().length);
//压缩的流
//压缩流 GZIPOutputStream
//内存流:ByteArrayOutputStream
//得到内存流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gzips = new GZIPOutputStream(baos);
//读取数据
byte [] b = baos.toByteArray();
System.out.println(b.length);
------------------------------------常用方法-----------------------------------------------
//设置响应头 (以键值对来进行存储,键无法改变)
//设置服务器的压缩格式
resp.setHeader("Content-Encoding","gzip");
//设置文本的长度
resp.setHeader("Content-length",b.length+"");
//规定其为设置字节数组
resp.setHeader("Accept","bytes");
//不加载浏览器缓存中的数据
resp.setHeader("Cache-Control","no-cache");==>压缩的时候一般对于的大文本 ,小文本看不出效果
实现下载图片
<a href="UserServlet?fileName=1.jpg">下载</a>前端代码
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/1.jpg");//获取是发布到服务的图片的地址 返回值是一个输入流对象
//返回的是resp.getOutputStream() 输入出流对象 ==> 字节 read()==>返回的读取的数据 read(b) 读取是有效的字节长度
String fileName= req.getParameter("fileName");
resp.setHeader("Content-Disposition","attachment;fileName="+fileName);//设置读取
//得到输出流对象
ServletOutputStream sos = resp.getOutputStream();
//下载文件一定加上这一句话
byte[] b = new byte[1024];
int leng =-1;
while ((leng=is.read(b)) !=-1){
sos.write(b,0,leng);
}
sos.close();
实现图片显示到游览器
响应的内容格式: Content-Type 1.text/html 文件 jpg gif 图片 ==>把图片写入到浏览器
//设置响应的内容的格式
resp.setHeader("Content-Type","jpg");
// 把图片转换成流对象
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/1.jpg");//发布项目的地址
//得到respone的写入对象
ServletOutputStream sot = resp.getOutputStream();
// 把数据读取出来写入ServletOutputStream
byte [] b = new byte[1024];
int leng =-1;
while ((leng=is.read(b)) !=-1){
sot.write(b,0,leng);
}
//关闭方法
sot.close();
写入字节和字符操作
/写字节/
resp.setContentType("text/html;charset=utf-8");
ServletOutputStream sos = resp.getOutputStream();
sos.write("addd".getBytes());
os.close();
//写字符//
//设置响应的 编码格式 以及内容的类型
PrintWriter pw = resp.getWriter();
pw.write("dddd");
pw.close();
resp.getOutputStream().write(97);
resp.getWriter().write("ddddd");
ServletContext
表示服务器的上下文对象 ,它的生命周期是随着tomcat的创建而创建 随着服务器的销毁而销毁
作用:
-
是获取web的全局配置文件
- 以键值对的形式来进行页面参数的传递
HttpServletResponse操作响应体
就是在网页上写内容
主要方法:(上面案例有使用)
resp.getOutputStream() 主要是用于来写字节
resp.getWriter() 主要用于写字符 ==>两个不要一起用(容易产生错误)
重定向
原理图:跳转到另一个界面
方法:resp.sendRedirect(“index.jsp”); 参数是传递的是需要跳转的界面
注:重定向相当于两次请求间
设置隔多长时间在跳转到某个界面
方法:resp.setHeader(“refresh”,“2;index.jsp”); 第二个参数是 “时间(秒);重定向的界面”
HttpServletRequest
servlet创建的请求对象 ==>继承 ServletRequest(不支持Http协议),httpServletRequest支持http协议
HttpServletRequest 也可以操作请求行 与请求头 请求体
常见的请求头:
HttpServletRequest 操作请求行
请求的地址, 请求的端口号 请求的参数 请求方法的名称,请求的访问根目录(如果项目与根目录一样,访问就是空的)
// 获取到请求的方法
String method = req.getMethod();
// 获取到跟的路径
String path = req.getContextPath();
// 获取请求拼接的参数
String query = req.getQueryString();
// 获取的是uri地址
String uri = req.getRequestURI();
//获取的是url地址
StringBuffer url = req.getRequestURL();
获取网络资源
String user = req.getRemoteUser();获取到客户端的用户名
String addr = req.getRemoteAddr();获取到客户端的地址
String ip =req.getRemoteHost();获取其ip地址
int port = req.getRemotePort();获取端口号
req.getLocalAddr() ==>获取服务器的地址
req.getLocalName(); ==>服务器ip
req.getLocalPort(); 服务器端口号
req.getServletPath(); 获取的访问路径
req.getServerName(); 服务器的ip地址
req.getServerPort(); 服务器端口号
注册功能的实现:
注册功能的流程图
servlet层
重要方法 :
req.getParameter(“uname”); 根据name值获取单个
req.getParameterValues(“hobbey”); 根据name值获取一组
设置编码:三步
第一步:
resp.setContentType(“text/html;charset=utf-8”); ==>到tomcat里配置 URIEncoding=“UTF-8”
第二步
resp.setCharacterEncoding(“utf-8”);
第三步
req.setCharacterEncoding(“utf-8”);
@WebServlet(name = "user1Servlet",urlPatterns = "/user1Servlet")
//注意url要加 /
//前端请求的那个URL直接写UserServlet不用加 /
public class User1Servlet extends HttpServlet {
//调用service层的方法
private UserService userService ;
@Override
public void init() throws ServletException {
userService = new UserServiceImpl();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//乱码设置
//配置Tomcat
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
//使用req.getParameter获取name值
String username = req.getParameter("username");
String password = req.getParameter("password");
String sex = req.getParameter("sex");
String[] hobbey = req.getParameterValues("hobbey");//获取同一个name的多个值
String hobbey_str = "";//多个选项结果使用字符串拼接存入数据库
if (hobbey != null && hobbey.length > 0) {//非空判断
for (String str : hobbey) {
hobbey_str += str + ";";
}
}
String u_text = req.getParameter("u_text");
User user = new User(username, password, sex, hobbey_str, u_text);
boolean b = userService.addUser(user);
if (b) {
resp.sendRedirect("index.jsp");
} else {
resp.sendRedirect("error.html");
}
}
}
service层
public class UserServiceImpl implements UserService {
private UserDao userDao=new UserDaoImpl();//私有
@Override
public boolean addUser(User user) {
int i = userDao.addUser(user);
if (i>0){
return true;
}
return false;
}
}
dao层
@Override
public int addUser(User user) {
DataSource ds=new ComboPooledDataSource();
QueryRunner qr=new QueryRunner(ds);
String sql="insert into user(uname,upwd,usex,uhobbey,utext) values(?,?,?,?,?)";
Object [] objects={user.getUname(),user.getUpwd(),user.getUsex(),user.getUhobbey(),user.getUtext()};
int unm= 0;
try {
unm = qr.update(sql,objects);
} catch (SQLException e) {
e.printStackTrace();
}
return unm;
}
实体类
public class User implements Serializable {
private int uid;
private String uname;
private String upwd;
private String usex;
private String uhobbey;
private String utext;
public User() {
}
public User(int uid, String uname, String upwd, String usex, String uhobbey, String utext) {
this.uid = uid;
this.uname = uname;
this.upwd = upwd;
this.usex = usex;
this.uhobbey = uhobbey;
this.utext = utext;
}
public User(String uname, String upwd, String usex, String uhobbey, String utext) {
this.uname = uname;
this.upwd = upwd;
this.usex = usex;
this.uhobbey = uhobbey;
this.utext = utext;
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
public String getUsex() {
return usex;
}
public void setUsex(String usex) {
this.usex = usex;
}
public String getUhobbey() {
return uhobbey;
}
public void setUhobbey(String uhobbey) {
this.uhobbey = uhobbey;
}
public String getUtext() {
return utext;
}
public void setUtext(String utext) {
this.utext = utext;
}
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", uname='" + uname + '\'' +
", upwd='" + upwd + '\'' +
", usex='" + usex + '\'' +
", uhobbey='" + uhobbey + '\'' +
", utext='" + utext + '\'' +
'}';
}
}