需要两个jar包,能让JSP使用c标签。分别是:standard.jar和jstl.jsp。
c标签属于JSTL库标签。专用于Java Web。
JSTL库存在的意义是:让JSP文件中,不再使用Java代码。当然,这也存在着弊端,前台WEB开发人员需要熟悉JSTL库。
先配置好SpringMVC。如果不会配置,可以参考博文:点击参考
新建好login.html:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="Login.spring" method="post">
账号:<input type="text" name="username" id="username"> <br />
密码:<input type="text" name="password" id="password"> <br /> <input
type="submit" value="提交">
</form>
</body>
</html>
注意:这里表单提交的地址为:Login.spring。也就意味着需要在web.xml中让Spring核心servlet拦截.spring这个字符串
Login.java:
package controller;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller // 设置该类为拦截器
public class Login {
// 处理Login.spring请求
@RequestMapping("/Login")
public String login(HttpServletRequest request, HttpServletResponse response, Model model) {
try {
// 设置编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 得到前台的数据
String username = request.getParameter("username");
String password = request.getParameter("password");
// 将数据装在ArrayList中
ArrayList<HashMap<String, String>> arrayList = new ArrayList<>();
HashMap<String, String> hashMap = new HashMap<>();
hashMap.put("username", username);
hashMap.put("password", password);
arrayList.add(hashMap);
// 将ArrayList装到model中
model.addAttribute("arrayList", arrayList);
// 跳转到show.jsp
return "show.jsp";
} catch (Exception e) {
e.printStackTrace();
}
// 跳转到login.html
return "login.html";
}
}
接着show.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示提交信息</title>
</head>
<body>
<c:forEach var="item" items="${arrayList}">
<c:out value="账号:${item.username}" />
<br />
<c:out value="密码:${item.password}" />
</c:forEach>
</body>
</html>
效果:
在显示提交信息的网页中,浏览器的地址为:http://localhost:8080/TestSpring/Login.spring,也就是意味着路径并没有发生改变。也就是说,Login类中的login()方法return出来的字符串属于转发
转发与重定向的区别:
转发:JSP会调用一个内部方法来调用目标【show.jsp】。新的页面会继续处理刚刚的请求,但是浏览器并不知道请求的内容。所以路径并未发生改变。
请求过程如下:
用户请求->服务器->组件1->组件2->服务器->用户
重定向:当前页面会向浏览器请求新的页面。所以路径会发生改变。
请求过程如下:
用户请求->服务器->组件->服务器->用户->新的请求
可以看出,转发较重定向而言,效率高、速度快,还保存着request中的数据。
所以,上述的请求属于转发。但是,重定向也有一定的需求。因为有的用户还是希望能看到路径的。SpringMVC已经封装好了ModelAndView类。
我们改写:Login.java:
package controller;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller // 设置该类为拦截器
public class Login {
// 处理Login.spring请求
@RequestMapping("/Login")
public ModelAndView login(
// 通过注解的方式,自动获取前台的值,如果未获取成功会报错
@RequestParam("username") String username,
@RequestParam("password") String password,
HttpServletRequest request, HttpServletResponse response) {
try {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("username", username);
hashMap.put("password", password);
// 将modelMap装进ModelAndView中
ModelAndView modelAndView = new ModelAndView("redirect:show.jsp", hashMap);
return modelAndView;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
在修改show.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>显示提交信息</title>
</head>
<body>
账号:<c:out value="${param.username}" />
<br />
密码:<c:out value="${param.password}" />
</body>
</html>
我们试着运行代码:
我们可以看到,在账号输入框填写“账号”,密码输入框填写“密码”。提交表单后,路径变成了:http://localhost:8080/TestSpring/show.jsp?password=%E5%AF%86%E7%A0%81&username=%E8%B4%A6%E5%8F%B7 。已经显示路径了。