运行步骤:
浏览器通过http协议发送请求到服务器、服务器通过http协议解析出url,并将请求数据存储到服务器的对象中,并在url中找到执行的虚拟项目名称,在请求地址中找到servlet的别名,然后在web.xml中找到对应的servlet,接着在web.xml中找到该servlet的具体路径,请求数据存储request在对象中(request由服务器创建),服务器调用service方法(方法中为具体的逻辑),request作为实参传递到servlet方法中,服务器处理完结果后,将结果存到response中响应给服务器(response已经存储好响应的地址)。浏览器使用的是iso8859-1的编码格式,服务器使用的是UTF-8格式,需要转码,不然乱码
Servlet流程总结:
浏览器发起请求到服务器(请求)
服务器接受浏览器的请求,进行解析,创建request对象存储请求数据
服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法
servlet的方法执行进行请求处理
//设置请求编码格式
//设置响应编码格式
//获取请求信息
//处理请求信息
//创建业务层对象
//调用业务层对象的方法
//响应处理结果
请求转发:调动其余的servlet,实现各servlet之间的联动,减少代码冗余
注意:return结束即可
利用request.setAttribute("键值",“信息”);实现servlet之间的数据扭转,生命周期,一次请求内
重定向:
* 解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。
* 使用:
* resp.sendRedirect(String uri);
* 示例:
* resp.sendRedirect("/login/main");
* 特点:
* 两次请求,两个request对象。(所以不能用request传数据)
* 浏览器地址栏信息改变
* 时机:
* 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。
* 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。
Servlet重定向路径总结:
* 相对路径:从当前请求的路径查找资源的路径。相对路径是从项目根目录下找,即weebroot下
* 相对路径如果servlet的别名中包含目录,会造成重定向资源查找失败。(从当前路径去找,即删除当前路径,再往后拼)
* 绝对路径:第一个/表示服务器根目录
* /虚拟项目名/资源路径
*
* Servlet请求转发:
* /表示项目根目录(weebroot)
* req.getRequestDispatcher("/资源路径").forward(req, resp);
*
* JSP页面路径总结:
*第一个/代表服务器根目录
*如:form表单中action路径
*也有相对路径和绝对路径的区别
*相对路径就是在当前页面下,去除当前位置,再加上请求的路径。
*问题:在http://localhost:8080/mg/main/main.jsp路径下,form表单action=“user”,即请求别名为user的servlet,但是前面登录也是这么写的,在这个功能中却报错,按这种方式提交,没有访问到servlet,打开后台,请求的url是http://localhost:8080/user/user,我也不知道为什么有两个user,且项目根目录也不见了。
状态:未解决
不同请求之间的数据传输
Cookie学习:
* 作用:解决了发送的不同请求的数据共享问题
* 使用:
* Cookie的创建和存储
* //创建Cookie对象
* Cookie c=new Cookie(String name, String value);
* //设置cookie(可选)
* //设置有效期
* c.setMaxAge(int seconds);
* //设置有效路径
* c.setPath(String uri)
* //响应Cookie信息给客户端
* resp.addCookie(c);
* Cookie的获取
* //获取Cookie信息数组
* Cookie[] cks=req.getCookies();
* //遍历数组获取Cookie信息
* 使用for循环遍历即可,示例:
if(cks!=null){
for(Cookie c:cks){
String name=c.getName();
String value=c.getValue();
System.out.println(name+":"+value);
}
}
* 注意:
* 一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。
* 特点:
* 浏览器端的数据存储技术。
* 存储的数据声明在服务器端。
* 临时存储:存储在浏览器的运行内存中,浏览器关闭即失效。
* 定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
* 默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径
session:
用户使用浏览器第一次向服务器发送请求,服务器在接受到请
求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建 一个 session 对象,用来存储用户请求处理相关的公共数据,并将 此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中 (临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请 求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后, 调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其 对应的 session 对象
ServletContext 对象:
作用:
解决了不同用户的数据共享问题
原理:
ServletContext 对象由服务器进行创建,一个项目只有一个对
象。不管在项目的任意位置进行获取得到的都是同一个对象,那
么不同用户发起的请求获取到的也就是同一个对象了,该对象由
用户共同拥有。
特点:
服务器进行创建
JSP:
浏览器发起请求,默认是找servlet,在项目中的web.xml中没找到,就到服务器的web.xml全局配置中找;请求 JSP,请求被 Tomcat 服务器接收,执行
JspServlet 将请求的 JSP 文件转义成为对应的 java 文件(也是
Servlet),然后执行转义好的 java 文件
遇到的问题
问题一:在JSP中写下<%=((User)session.getAttribute("user")).getUname()%>,session取出是object对象,需要强转成User对象,加上后就会报错500,提示XXX cannot be resolved to a type!网上给出几种解决办法:1.导包,包的问题2.jdk环境不统一的问题3. ,我依次都试了,还是不行。
状态:未解决
问题二:在js中使用“window.top.location.href="../mg/user?oper=out";”跳转到servlet时,无法跳转,报404错误,通过查找,浏览器url显示的地址是错误的,原来是地址错误造成,因此,因该写上绝对地址,我其实是照着视频敲的,但是视频中没问题,我就出问题了,视频中,<base href="<%=basePath%>">应该起作用了,不知道是使用idea的原因还是怎么,我就不行,根目录无法自动补上。
状态:已解决
问题三:
Dao层处理步骤:
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//获取连接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/3306/test","root","123456");
//创建SQL语句
String sql = "updata t_user set pwd=? where uid=?";
//创建SQL命令对象
ps = conn.prepareStatement(sql);
//给占位符赋值
ps.setString(1,newPwd);
ps.setInt(2,uid);
//执行
index = ps.executeUpdate();
//关闭资源
Servlet层处理步骤:
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取数据
//处理请求