一、JSP校验
一般我们在提交表单的时候会在前端进行信息校验,但有些用户会故意直接访问校验的那个jsp,如果这样的次数多了,服务器不停调用数据库无疑会大大增加服务器的负担,所以我们可以在服务器端增加一个校验。 前端
<form action="DoLogin">
<p>账号:<input type="text" name="user"><span class="span_user"></span> </p>
<p>密码:<input type="password" name="pwd"><span class="span_pwd"></span></p>
<input type="submit"/>
</form>
<script type="text/javascript">
$(()=>{
$("input[name='user']").blur(function (){
console.log($(this).val())
if($(this).prop("value") == "") {
console.log(111)
$(".span_user").text("用户名不能为空").css("color", "red").addClass("error")
}else{
$(".span_user").text("√").css("color", "green").removeClass("error")
}
})
$("input[name='pwd']").blur(function (){
if($("input[name='pwd']") == ""){
$(".span_pwd").text("密码不能为空").css("color", "red").addClass("error")
}else{
$(".span_pwd").text("√").css("color", "green").removeClass("error")
}
})
$("form").submit(function (){
var error = $(".error")
$("input[name='user']").trigger("blur")
$("input[name='pwd']").trigger("blur")
if(error.length != 0){
return false
}else{
return true
}
})
<%
String msg = (String) request.getAttribute("msg");
if(msg !=null && !msg.equals("")){
out.print("alert('"+msg+"')");
}
%>
})
</script>
后端
@WebServlet(urlPatterns = "/DoLogin")
public class DoLogin extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user = req.getParameter("user");
String pwd = req.getParameter("pwd");
if(user== null ||user.equals("")){
req.getRequestDispatcher("protected.jsp").forward(req,resp);
return ;
}
if(user.equals("admin") && pwd.equals("123456")){
req.getRequestDispatcher("index.jsp").forward(req,resp);
}else{
req.setAttribute("msg","账号或密码不正确");
req.getRequestDispatcher("Login.jsp").forward(req,resp);
}
}
}
二、路径问题
- 绝对路径
- 绝对路径是包含协议、地址、端口号以及需要访问的详细地址,它的范围最广,可以访问不同服务器的项目
<a href="http://127.0.0.1:8080/servlet02/path1/update.jsp">同一个项目下同一个文件夹中的文件update.jsp</a> <br/>
<a href="http://127.0.0.1:8080/servlet02/path1/subpath/delete.jsp">同一个项目下同子文件夹中的文件delete.jsp</a> <br/>
<a href="http://127.0.0.1:8080/servlet02/path2/add.jsp">同一个项目下同级文件夹中的文件add.jsp</a> <br/>
<a href="http://127.0.0.1:8080/servlet02/index.jsp">同一个项目下父级文件夹中的文件index.jsp</a> <br/>
<a href="http://127.0.0.1:8080/servlet02/servlet/DoLogin2">访问servlet的路径</a> <br/>
<a href="http://127.0.0.1:8080/servlet01/index.jsp">同一个服务器中不同项目中的文件servlet01/index.jsp</a> <br/>
<a href="http://192.168.153.63:9527/jsp/time.jsp">同一个局域网中不同服务器中的项目</a> <br/>
- 相对路径A(跟路径)
<h3>根路径(用"/"开始后面紧跟项目的名称+需要访问的路径){范围:同一个服务器中所有的项目} "/":当前的服务器 "/"=E:\apache-tomcat-7.0.79\webapps </h3>
<a href="/servlet02/path1/update.jsp">同一个项目下同一个文件夹中的文件update.jsp</a>
<a href="/servlet02/path1/subpath/delete.jsp">同一个项目下同子文件夹中的文件delete.jsp</a>
<a href="/servlet02/path2/add.jsp">同一个项目下同级文件夹中的文件add.jsp</a>
<a href="/servlet02/index.jsp">同一个项目下父级文件夹中的文件index.jsp</a> <br/>
<a href="/servlet02/servlet/DoLogin2">访问servlet的路径</a> <br/>
<a href="/servlet01/index.jsp">同一个服务器中不同项目中的文件servlet01/index.jsp</a>
- 相对路径B(根据文件所在位置访问)------不推荐
<a href="update.jsp">同一个项目下同一个文件夹中的文件update.jsp</a> <br/>
<a href="subpath/delete.jsp">同一个项目下同子文件夹中的文件delete.jsp</a> <br/>
<a href="../path2/add.jsp">同一个项目下同级文件夹中的文件add.jsp</a> <br/>
<a href="../index.jsp">同一个项目下父级文件夹中的文件index.jsp</a> <br/>
<a href="../servlet/DoLogin2">访问servlet的路径</a> <br/>
<a href="../../servlet01/index.jsp">同一个服务器中不同项目中的文件servlet01/index.jsp</a>
- 相对路径C(根据base标签来优化情况A)--------推荐
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
<base href="<%=request.getContextPath()+"/"%>">
</head>
<body>
<a href="success.jsp"></a> //自动包含了根路径
$END$
</body>
</html>
三、转发和重定向
转发
转发调用的是req.getRequestDispatcher(“index.jsp”).forward(req,resp);它是在服务器端进行页面跳转的,所以浏览器并不知道它的跳转,浏览器的地址栏仍然是跳转之前的地址 特点 1. 速度快,支持数据共享 2. 但会导致表单重复提交 3. 不会经过过滤器
重定向
重定向用的是resp.sendRedirect(),它会告诉浏览器应该访问哪个地址,然后浏览器再对该地址发出请求。 特点
- 由于要让浏览器发送请求,所以效率不如转发
- 不支持共享数据
- 不会导致表单重复提交
转发和重定向的路径区别
resp.sendRedirect("/servlet03/success.jsp");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
四、request和response更多请求
requesst
/*******[1]获得req对象中的头信息*(了解)*******************/
Enumeration<String> headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()){
String next = headerNames.nextElement();
System.out.println(next+"-----"+req.getHeader(next));
}
/*******[2]获得URL地址信息*********************/
//http
System.out.println(req.getScheme());
//127.0.0.1
System.out.println(req.getServerName());
//8888
System.out.println(req.getServerPort());
// /servlet/MoreServlet
System.out.println(req.getServletPath());
// √ /servlet22
System.out.println(req.getContextPath());
// √ /servlet22/servlet/MoreServlet
System.out.println(req.getRequestURI());
// √ http://127.0.0.1:8888/servlet22/servlet/MoreServlet
System.out.println(req.getRequestURL());
// GET
System.out.println(req.getMethod());
// √ pwd=123&zh=456
System.out.println(req.getQueryString());
/********[3]req对象获得值的操作 (重点)****************/
//获得前台的数据
String zh = req.getParameter("zh");
//获得前台的爱好的选择的多选操作
String[] hobby = req.getParameterValues("hobby");
/*********[4]获得远程的和本地的信息(了解)*************/
//获得远程的信息---客户端浏览器
System.out.println(req.getRemoteAddr());
System.out.println(req.getRemoteHost());
System.out.println(req.getRemotePort());
//获得本地的信息---本地服务器
System.out.println(req.getLocalAddr());
System.out.println(req.getLocalName());
System.out.println(req.getLocalPort());
/***********[5]获得其他对象的操作(重点)************************/
//获得session对象
HttpSession session = req.getSession();
//获得全局的对象
ServletContext servletContext = req.getServletContext();
ServletContext servletContext2 = this.getServletContext();
//获得cookie对象
Cookie[] cookies = req.getCookies();
/***********[6]req对象中的其他的方法(重点)*******************/
//解决中文乱码
req.setCharacterEncoding("utf-8");
//转发
req.getRequestDispatcher("").forward(req, resp);
req.setAttribute("msg", "");
req.getAttribute("msg");
response
resp.setContentType("text/html;charset=utf-8");
//设置响应回去的编码方式
resp.setCharacterEncoding("utf-8");
//设置文本的长度 ---文件下载的时候需要使用
resp.setContentLength(1024);
//重定向
/*resp.sendRedirect("");*/
//把cookie对象保存到resp对象中
resp.addCookie(cookie);
//(了解)
//在响应头中添加对应的信息如果name一致也不会覆盖
resp.addHeader("cou", "javaEE");
resp.addHeader("cou", "javaSE");
//设置指定的响应头信息 name一致会覆盖
resp.setHeader("cou1", "java");
resp.setHeader("cou1", "javascript");
|