1.request与response类似,我们通过抓包工具可以看到request请求分为请求行,请求头,请求体(当请求方式为post的时候有)
2.request获取请求行的信息
获得请求方式request.getMethod() 获得请求的资源路径 request.getRequesturi() 获得web应用的名称request.getContextPath() 获得地址后面的参数字符串request.getQueryString()
package web15request_1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletLine extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1获取我的请求方式
String method = request.getMethod();
System.out.println(method);
//2.获得请求的资源
String uri = request.getRequestURI();
System.out.println(uri);
//获得 web应用的名称
String name = request.getContextPath();
System.out.println(name);
//地址后的参数字符串
String str = request.getQueryString();
System.out.println(str);
}
POST
/web15request_1/servlet/ServletLine
/web15request_1
null 因为这个是post请求所以这里的地址后面的字符串显示为null,他应该存在请求体中
注意,request封装的是客户端的信息,同时里面就包含客户机的信息,谁访问我,我就可以获得谁的机器的信息。
3request获取请求头的信息
getHeader("User-Agent"); 字符串从上面选择 request.getHeaderNames()
其中referer这个头的目的是检测请求的来源,用来防盗的。服务器检测你的请求来源是不是我服务器的ip地址,如果是就赶回给访问者资源,如果是从别的网站上来请求我的资源 就不给返回。以此防止有的网站会盗用别人的资源。
4request获得请求体的信息
getParameter()此处括号中要填name,所以在写前端的时候用html写,input中的name属性很重要,否则服务器获取不到。
我们重点记住里面的getParameter()和 getParameterMap()
//获得所有参数 遍历map
Map parametermap = request.getParameterMap()
for(Map.Entry entry:parametermap.entrySet()){
System.out.println(entry.getKey());
for(String stri:entry.getValue()){
System.out.println(stri);
}
}
username
cs
---------------
psw
123
---------------
hobby
lan
yumao
---------------
注意:对于get请求方式同样适用。
5.request的其他功能
request是一个域对象,同context,就是一块存储数据的内存,提到域对象,我们要知道有三个方法,getAttribute(String name);setAttribute(String name,,Object obj);removeAttribute(String name)
可以把域比作垃圾桶,放在大街上所有人可以用,放到教室,班级学生可以用,而ServletContext是放在大街上的垃圾桶,学这个域之前我们需知道一个概念就是请求转发,与重定向是相互对应的。
两个的区别在于:重定向是客户端两次访问服务器,请求转发是一次访问,特点:快速,省了两次传输过程并且请求地址不变
如何 实现请求转发:
请求就是请求资源地址是啥,将其转给服务器内部的另一个servlet,他们在同一个项目下,实现的步骤有二:
获取转发器,使用转发器将request,reponse作为参数给另一个servlet
getRequestDispatcher(String path) forward(request,response)
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//response.getWriter().write("hello haohao...");
//将servlet1的请求转发给其他的servlet
RequestDispatcher re = request.getRequestDispatcher("/servlet/ServletLine");
//一定把路径写正确 从web15开始的路径
re.forward(request, response);
}
我们知道,访问一次服务器就会创建一个request对象和response对象,而ServletContext只创建一次就可以了。所以,我们知道request中信息所作用范围:一次请求中
分析这个过程:先有一个客户端页面form表单,post请求,传给tomcat服务器,tomcat内核会解析http请求,并且创建request对象,同时创建response对象,并且通过web.xml找到我们写好的后台servlet代码,获取request的信息,并且tomcat有一个BeanUtils可以直接将request请求体的内容映射到一个实体。接下来就是将信息存储到数据库中,中间过程会遇到乱码的问题。
实现步骤:
(1)实现一个注册的页面,action = “servlet的地址”methode=“POST”,并且给每个需要插入数据库的列起名称
(2)servlet中的java代码实现步骤:
//1.获取request中的内容 // 2.封装成实体 //3 一个业务操作方法,也就是往数据库中插入
package web15request_1;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Map;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
public class ServletRegister extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//response.getWriter().write("hello haohao...");
//1.获取request的信息 这里因为要用到BeanUtils映射,所以获取请求体用getparameterMap
Map reparameter = request.getParameterMap();
//2.封装请求的信息,
User user = new User();
try {
BeanUtils.populate(user,reparameter);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
register(user);
}
private void register(User user) {
// TODO Auto-generated method stub
//这里用到的是jdbc的知识
Connection conn = JDBCUtil.getConnection();
String sql = "insert into user values(?,?,?,?,?,?,?,?,?,?)";
PreparedStatement pre = null;
try {
pre = conn.prepareStatement(sql);
pre.setString(1,UUID.randomUUID()+"");
System.out.println(UUID.randomUUID().toString().length());
pre.setString(2,user.getUsername());
pre.setString(3,user.getPassword());
pre.setString(4,user.getName());
pre.setString(5,user.getEmail());
pre.setString(6,null);
pre.setString(7,user.getBirthday());
pre.setString(8,user.getSex());
pre.setString(9,null);
pre.setString(10,null);
pre.executeUpdate();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}