1.能够使用Request对象获取HTTP协议请求内容(掌握)(包含请求行、请求头、请求体的信息)
2.能够处理HTTP请求参数的乱码问题 (掌握)
3.能够使用Request域对象 (掌握)
4.能够使用Request对象做请求转发(掌握)
5.能够完成登录案例
6.能够理解相对路径和绝对路径(了解)
什么是HttpServletRequest?
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
以下是API文档中的介绍:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vcasrGEf-1592796525282)(img\12.png)]
通过文档阅读可以注意到一个细节HttpServletReuqest不是相关请求的顶级接口,它继承自父接口——ServletRequest:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPHyelU7-1592796525285)(img\13.png)]
通过Request对象进行的常用操作:
获取客户机信息
获取请求头信息
获取请求参数
利用请求域传递对象
HttpServlet有许多的API我们从何学起?
答:我们按照学习http请求组成部分,按——请求行、请求头、请求体顺序学习。
在http协议中我已经看到了http协议中请求行的内容——分为请求方式、请求路径、协议版本。在HttpServletRequest概述中我们知道浏览器与请求相关的数据封装在request中,因此,接下来我们学习如何使用request对象获取请求行的数据。
String getMethod() 获取请求方式的类型(重要)
String getRequestURI() 获取请求行中的资源名部分:/项目名/资源名
StringBuffer getRequestURL() 获取客户端发出请求完整URL:http://localhost:8080/项目名:资源名
(重要)
注:
uri: 统一资源标识符,用来标识一个资源,资源路径。(相当于身份证)
url: 统一资源定位符,是一种具体的URI,可以用来标识一个资源.并且指明了如何定位一个资源.(相当于身份证中的地址)
String getProtocol() 获取当前协议的名称和版本(了解)
String getRemoteAddr() 获取客户端的IP地址
package cn.itcast.web;
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(name = "DemoServlet",urlPatterns = "/demo")
public class DemoServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1. String getMethod()
获取请求方式的类型
* */
String method = request.getMethod();
System.out.println("获取请求方式的类型:"+method);
/**
* 2. String getRequestURI()
获取请求行中的资源名部分
* */
String requestURI = request.getRequestURI();
System.out.println("获取请求行中的资源名部分:"+requestURI);
/**
* 3. StringBuffer getRequestURL()
获取客户端发出请求完整URL
* */
StringBuffer getRequestURL = request.getRequestURL();
System.out.println("获取客户端发出请求完整URL:"+getRequestURL);
/**
* 4. String getProtocol()
获取当前协议的名称和版本
* */
String getProtocol = request.getProtocol();
System.out.println("获取当前协议的名称和版本:"+getProtocol);
/**
* 5. String getRemoteAddr()
获取IP地址
* */
String getRemoteAddr = request.getRemoteAddr();
System.out.println("获取IP地址:"+getRemoteAddr);
}
}
效果一:测试地址——http://localhost:9090/day02/demo
获取请求方式的类型:GET
获取请求行中的资源名部分:/day02/demo
获取客户端发出请求完整URL:http://localhost:9090/day02/demo
获取当前协议的名称和版本:HTTP/1.1
获取IP地址:0:0:0:0:0:0:0:1
效果二:测试地址——http://127.0.0.1:9090/day02/demo
获取请求方式的类型:GET
获取请求行中的资源名部分:/day02/demo
获取客户端发出请求完整URL:http://127.0.0.1:9090/day02/demo
获取当前协议的名称和版本:HTTP/1.1
获取IP地址:127.0.0.1
问:为什么要测试两次?
答:同学们观察下两次打印的IP地址会发现不一样,因此,注意,Localhost和127.0.0.1效果一致,但是localhost默认使用ipv6本机地址——0:0:0:0:0:0:0:1,而127.0.0.1是ipv4的本机地址。
String getHeader(String name) 以String 的形式返回指定请求头的值
Enumeration getHeaderNames() 返回此请求包含的所有头名称的枚举(了解即可)
package cn.itcast.web;
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;
import java.util.Enumeration;
@WebServlet(name = "DemoServlet2",urlPatterns = "/demo2")
public class DemoServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1. String getHeader(String name)
以 String 的形式返回指定请求头的值
* */
String header = request.getHeader("User-Agent");
System.out.println("getHeader:"+header);
System.out.println();
/**
* 2. Enumeration getHeaderNames()
返回此请求包含的所有头名称的枚举
* */
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()){
System.out.println("getHeaderNames:"+headerNames.nextElement());
}
}
}
效果:
getHeader:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36
getHeaderNames:host
getHeaderNames:connection
getHeaderNames:cache-control
getHeaderNames:user-agent
getHeaderNames:upgrade-insecure-requests
getHeaderNames:accept
getHeaderNames:accept-encoding
getHeaderNames:accept-language
getHeaderNames:cookie
问:什么是盗链?
答:如下图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oPNj9IN3-1592796525288)(img\40.png)]
问:如何防止盗链?
答:在上图中用户一共发送两次请求,第一次访问正规服务器中的download.jsp页面,
第二次访问盗链者服务器中的download.jsp页面,二个download.jsp页面虽然内容相同,
但来源不相同。
如果download.jsp中的请求,来源于盗链者服务器,我们就显示不可以下载;
如果download.jsp中的请求,来源于正规服务器,我们就显示可以下载;
两次请求同一个域名,显示可以下载
两次请求同不同域名,显示无法下载
servlet演示代码:
/**
* 使用referer实现防盗链
* 用户->download.jsp->DownloadServlet
*/
@WebServlet(name = "DownloadServlet",urlPatterns = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
//获取请求头referer
String referer = request.getHeader("referer");
//如果请求头referer存在,且请求来源于正规服务器的download.jsp页面的话
if("http://127.0.0.1:8080/day41/download.jsp".equals(referer)){
//没有盗链,在浏览器中显示可以下载
writer.write("可以下载");
}else{
//请求来源于盗链者服务器的download.jsp页面的话
writer.write("这是盗链,不可以下载");
}
writer.flush();
writer.close();
}
}
测试:
第一次访问正规服务器中的download.jsp页面,并发出下载请求,正规服务器中的DownloadServlet通过验证referer的来源是否合理,这次下载请求来源合理,所以显示“可以下载”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o7pPNM02-1592796525291)(img\18.png)]
测试:
第二次访问盗链者服务器中的download.jsp页面,并发出下载请求,
正规服务器中的DownloadServlet通过验证referer的来源是否合理,这次下载请求来源不合理,
所以显示“这是盗链,不可以下载”。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2110j19-1592796525292)(img\19.png)]
获取用户当前使用的浏览器版本
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QRQ7UZkN-1592796525294)(img\20.png)]
package cn.itcast.web;
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(name = "UserAgentServlet",urlPatterns = "/userAgent")
public class UserAgentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String header = request.getHeader("User-Agent");
System.out.println("当前用户浏览器相关信息:"+header);
}
}
学习完了对请求行和请求头的内容,最后一部分就是请求体了,在请求体中,包含的是用户通过浏览器发送的请求参数,因此,我们主要学习的就是获取请求参数的方法。
String getParameter(String name) 根据表单的name属性 获取对应的值
String[] getParameterValues(String name) 获取name相同的所有value 例如复选框。
Map getParameterMap() 参数名作为key,参数值作为value,封装到map中。
准备html页面:getParam.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/day02/getParam" method="post">
用户名:<input type="text" name="username"><br>
爱 好:<input type="checkbox" name="hobby" value="football">足球
<input type="checkbox" name="hobby" value="basketball">篮球<br>
<input type="submit" value="提交">
</form>
</body>
</html>
创建GetParameterServlet
再GetParameterServlet中的doGet和doPost方法的参数列表,已经包含了request对象,调用相应方法即可。
package cn.itcast.web;
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;
import java.util.Map;
@WebServlet(name = "GetParameterServlet",urlPatterns = "/getParam")
public class GetParameterServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 1. String getParameter(String name)
根据表单的name属性 获取对应的值
* */
String username = request.getParameter("username");
System.out.println(username);
/**
* 2. String[] getParameterValues(String name)
获取name相同的所有value 例如复选框。
* */
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
/**
* 3. Map getParameterMap()
参数名作为key,参数值作为value,封装到map中。
* */
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
for (String s : map.get(key)) {
System.out.println(s);
}
}
}
}
我们在输入一些中文数据提交给服务器的时候,服务器解析显示出来的一堆无意义的字符,就是乱码。
那么这个乱码是如何出现的呢?如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o4qgj15k-1592796525295)(img\21.png)]
有乱码那么必须处理乱码,不同的请求方式处理乱码操作不同。
在Tomcat8及以后,只有post方式发起的请求会发生乱码,,GET方式发起的请求不会发生乱码。
在Tomcat7及以前的版本上,无论是GET方式还是POST方式都会发生中文乱码。
void setCharacterEncoding(String env)
设置请求体的编码
package cn.itcast.web;
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(name = "EncodingServlet",urlPatterns = "/encoding")
public class EncodingServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理post请求乱码
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
System.out.println(username);
}
}
现在我们已经可以使用request对象来获取请求参数,但是,如果参数过多,我们就需要将数据封装到对象。
以前封装数据的时候,实体类有多少个字段,我们就需要手动编码调用多少次setXXX方法,因此,我们需要BeanUtils来解决这个问题。
使用BeanUtils,完成数据的封装到实体类。
准备登录页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/day02/login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
在web目录下创建WEB-INF\lib文件夹,导入BeanUtils相关jar包
commons-beanutils-1.8.3.jar
commons-logging-1.1.1.jar
注意:导入完成还要关联jar包到项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZrohToZr-1592796525296)(img\23.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYlSt0XR-1592796525297)(img\24.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-twWFKTqQ-1592796525298)(img\25.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oLXWyQ8K-1592796525299)(img\26.png)]
点击OK,完成关联。
导入实体类User
package cn.itcast.domain;
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 + "]";
}
}
servlet代码:封装表单数据到User对象
package cn.itcast.web;
import cn.itcast.domain.User;
import org.apache.commons.beanutils.BeanUtils;
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;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数
Map<String, String[]> map = request.getParameterMap();
//创建要封装数据的对象
User user = new User();
//封装前打印一次数据
System.out.println(user);
try {
//封装数据
BeanUtils.populate(user, map);
} catch (Exception e) {
e.printStackTrace();
}
//封装后打印一次数据
System.out.println(user);
}
}
效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4mjTaaT6-1592796525300)(img\28.png)]
String getContextPath() 获取工程名字
package cn.itcast.web;
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(name = "ContextPathServlet",urlPatterns = "/context")
public class ContextPathServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取当前项目路径
String contextPath = request.getContextPath();
System.out.println(contextPath);
}
}
问:什么是域对象?
答:域对象是一个容器,这种容器主要用于servlet与servlet之间的数据传输使用的
void setAttribute(String name, Object o) 设置数据到request域
Object getAttribute(String name) 从request域获取数据
void removeAttribute(String name) 从request域移除数据
以上三个方法都是操作request中域对象的数据,与请求参数无关。
package cn.itcast.web;
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(name = "ScopeServlet",urlPatterns = "/scope")
public class ScopeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//存入数据
request.setAttribute("name","张三");
//获取数据
String name1 = (String) request.getAttribute("name");
System.out.println(name1);
//移除数据
request.removeAttribute("name");
String name2 = (String) request.getAttribute("name");
System.out.println(name2);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZCQgvEp-1592796525301)(img\29.png)]
RequestDispatcher getRequestDispatcher(String path) 获取请求转发器(request对象方法)
void forward(ServletRequest request, ServletResponse response) 将请求转发到另一个资源(servlet)上(RequestDispatcher对象的方法)
DispatcherServlet:
package cn.itcast.web;
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(name = "DispatcherServlet",urlPatterns = "/dispatcher")
public class DispatcherServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("对用户请求第一次处理");
request.setAttribute("result","test_data");
request.getRequestDispatcher("/test").forward(request,response);
}
}
TestServlet:
package cn.itcast.web;
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(name = "TestServlet",urlPatterns = "/test")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("对用户请求第二次处理");
String result = (String) request.getAttribute("result");
response.getWriter().write(result);
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MEB5MBVY-1592796525302)(img/img22.png)]
####3.5.4.1重定向
####3.5.4.2请求转发
实现用户登录功能。
用户名和密码正确,显示登录成功
用户名和密码错误,显示登录失败
设置一个登录页面准备提交表单数据(username、password)
导入相关jar包(BeanUtils、druid、mysql驱动、JDBCTempldate)
登录案例流程图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9PRkkPc8-1592796525303)(img\30.png)]
准备登录页面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/day02/login" method="post">
<table>
<tr>
<td>用户名</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>密码</td>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"/></td>
</tr>
</table>
</form>
</body>
</html>
在web目录下创建WEB-INF\lib文件夹,导入相关jar包(今天资料文件夹中有)
commons-beanutils-1.8.3.jar
commons-logging-1.1.1.jar
druid-1.0.9.jar
mysql-connector-java-5.1.18-bin.jar
spring-beans-4.2.4.RELEASE.jar
spring-core-4.2.4.RELEASE.jar
spring-jdbc-4.2.4.RELEASE.jar
spring-tx-4.2.4.RELEASE.jar
(注意:导入完成还要关联jar包到项目)
导入实体类User(今天资料文件夹中有)
package cn.itcast.domain;
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 + "]";
}
}
导入配置文件(c3p0_config.xml)和工具类(JDBCUtil)(今天资料文件夹中有):
JDBCUtils
servlet代码:
package cn.itcast.web;
import cn.itcast.dao.UserDao;
import cn.itcast.dao.impl.UserDaoImpl;
import cn.itcast.domain.User;
import org.apache.commons.beanutils.BeanUtils;
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;
import java.util.Map;
@WebServlet(name = "LoginServlet",urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数
Map<String, String[]> map = request.getParameterMap();
//创建要封装数据的对象
User user = new User();
try {
//封装数据
BeanUtils.populate(user, map);
} catch (Exception e) {
e.printStackTrace();
}
//用dao查询数据库
UserDao userDao = new UserDaoImpl();
User loginUser = userDao.login(user);
response.setContentType("text/html;charset=utf-8");
if(loginUser != null){
response.getWriter().write("登录成功!!!");
}else{
request.setAttribute("name",request.getParameter("username"));
request.getRequestDispatcher("/loginFail").forward(request,response);
}
}
}
================================================================================
package cn.itcast.web;
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(name = “LoginFailServlet”,urlPatterns = “/loginFail”)
public class LoginFailServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = (String) request.getAttribute(“name”);
response.getWriter().write(“用户:”+name+“登录失败!!!”);
}
}
dao代码
实现类:
package cn.itcast.dao.impl;
import cn.itcast.dao.UserDao;
import cn.itcast.domain.User;
import cn.itcast.utils.JDBCUtils;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
public class UserDao{
private JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
public User findUser(User user) {
String sql = "select * from user where username = ? and password = ?";
try {
User query = template.queryForObject(sql, new BeanPropertyRowMapper(User.class), user.getUsername(), user.getPassword());
return query;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
### 3.6 相对路径和绝对路径(了解)
#### 3.6.1 相对路径
相对路径是不以"/"开头的路径写法
相对路径相对的是当前资源的url路径,如果目标资源在当前资源的上一级则使用"../"先找到上一级目录;如果目标资源和当前资源处于同一级则直接使用目标资源的名称,如果目标资源在当前资源的下一级则先找到目标资源的上一级。
#### 3.6.2绝对路径
绝对路径是以"/"开头的路径写法,当请求转发的时候省略掉项目的根路径,只需要写"/资源路径"
当重定向或者其他情况下,省略掉服务器根路径,需要写"/项目路径/资源路径"
万一还是弄不懂,那么你就使用完整的url路径