SpringMVC_02_SpringMVC 控制器(1)

本篇主要介绍SpringMVC控制器的以下内容:

@RequestMapping 请求映射 

@RequestParam 请求参数 

ModelAndView 返回模型和视图 

SpringMVC 对象属性自动封装 

SpringMVCPOST 请求乱码解决 

Controller 内部转发和重定向 

我们通过一个简单的小项目来介绍。模拟学生管理(展示,添加,修改,删除)的过程。

定义实体类:Student,属性有:id,name,age并生成get,set,和3个参数的构造方法。

新建包:controller,写一个StudentController

@Controller
@RequestMapping("/student")
public class StudentController {

	private static List<Student> studentList = new ArrayList<Student>();
	//静态代码块,只执行一次,模拟数据
	static {
		studentList.add(new Student(1, "张三", 11));
		studentList.add(new Student(2, "李四", 22));
		studentList.add(new Student(3, "王五", 33));	
	}
	@RequestMapping("/list")
	public ModelAndView list() {
		ModelAndView mav = new ModelAndView();
		mav.addObject("studentList",studentList);
		mav.setViewName("list");
		return mav;
	}
	
}

我们模块化处理:在StudentController前加请求映射"student":可能还有成绩管理。在WEB-INF下建一个名为student的包,里面写关于student的jsp.

扫描二维码关注公众号,回复: 2811235 查看本文章

mav有两个方法:addobject是向ModelAndView(模型和视图)添加对象。setViewName:向视图解析器返回,解析成jsp

然后我们在WebContent目录下,建一个index.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%
    	response.sendRedirect("student/list.do");
    %>

直接请求student/list,经过Controller,执行list方法,把数据封装,并通过视图解析器转发到list,jsp,这就是展示数据。

<table>
	<tr>
		<th>编号</th>
		<th>姓名</th>
		<th>年龄</th>
		<th colspan="2">操作</th>
	</tr>
	<c:forEach var="student" items="${studentList }">
		<tr>
			<td>${student.id }</td>
			<td>${student.name }</td>
			<td>${student.age }</td>
			<td><a href="">修改</a></td>
			<td><a href="">删除</a></td>
		</tr>
	</c:forEach>
</table>

下面我们弄添加学生,在list.jsp下面写一个超链接:

<a href="${pageContext.request.contextPath }/student/preSave.do">添加学生</a>

这个地方不写add是因为修改的时候,也请求preSave让其判断,但一个是有参数的,一个是没有的。

<td><a href="${pageContext.request.contextPath }/student/preSave.do?id=${student.id }">修改</a></td>

preSave方法:

	@RequestMapping("/preSave")
	public ModelAndView preSave(@RequestParam(value="id",required=false) String id) {
		ModelAndView mav = new ModelAndView();
		if(id!=null) {
			mav.addObject("student",studentList.get(Integer.parseInt(id)-1));
			mav.setViewName("student/update");
			return mav;
		}
		mav.setViewName("student/add");
		return mav;
	}

@RequestParam(value="id",required=false):请求参数,获得请求url中的参数,在这里是获取修改按钮url里的参数:判断如果不为空,说明请求的url中是有参数的,那就是修改,获取到该id的Student,封装到ModelAndView中,并请求update,解析到update.jsp

如果是空,就表示是请求添加,直接解析到add.jsp.

update.jsp:

<form action="${pageContext.request.contextPath }/student/save.do" method="post">
	<table>
		<tr>
			<th colspan="2">学生修改</th>
		</tr>
		<tr>
			<td>姓名</td>
			<td><input type="text" name="name" value="${student.name }"></td>
		</tr>
		<tr>
			<td>年龄</td>
			<td><input type="text" name="age" value="${student.age }"></td>
		</tr>
		<tr>
			<td><input type="hidden" name="id" value="${student.id }"></td>
			<td><input type="submit" value="修改"></td>
		</tr>
	</table>
</form>

add.jsp:

<form action="${pageContext.request.contextPath }/student/save.do" method="post">
	<table>
		<tr>
			<th colspan="2">学生添加</th>
		</tr>
		<tr>
			<td>姓名</td>
			<td><input type="text" name="name"></td>
		</tr>
		<tr>
			<td>年龄</td>
			<td><input type="text" name="age"></td>
		</tr>
		<tr>
			<td colspan="2"><input type="submit" value="提交"></td>
		</tr>
	</table>
</form>

两个jsp都请求save,都会把数据自动封装,但update封装的数据是有id的,而添加是没有id的,根据这个写save方法:

	@RequestMapping("/save")
	public String add(Student student) {
		if(student.getId()!=0) {
			Student s = studentList.get(student.getId()-1);
			s.setName(student.getName());
			s.setAge(student.getAge());
		}else {
			studentList.add(student);
		}
		return "redirect:/student/list.do";
	}

有就是封装的Student里面的id不为0,就是修改,然后根据id获取到数据中指定的对象,进行修改即可,

id为0,就是添加,直接把封装的对象,添加到数据中就行,执行完后重定向到list.jsp.

redirect:/  :重定向,不把参数传过去,并且不会改变浏览器url.

forward:/  :转发,不写默认就是转发,会将参数带过去,并且浏览器url也会改过去。

剩下一个删除,直接在删除时,请求dalete.do,调用Controller中delete方法,请求参数,得到url里面的id,根据id,删除指定Student对象。然后重定向到list.jsp.

	@RequestMapping("/delete")
	public String delete(@RequestParam(value="id") int id) {
		studentList.remove(id-1);
		return "redirect:/student/list.do";
	}

最后,因为这是为了介绍SpringMVC的Controller控制器,所以就没用数据库,直接静态封装的数据,所以id也不是自增,id肯定会有bug ,比如添加的数据,不能修改。因为找不到id,添加时候没有添加id,默认就是0.

在添加时候,返回过来的数据会有乱码,所以要在web.xml中定义拦截器,拦截所有请求,将编码统一设置为utf-8:

	<!-- 拦截所有请求,统一utf-8编码 -->
	<filter>
		<filter-name>characterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>characterEncodingFilter</filter-name>
		<url-pattern>*.do</url-pattern>
	</filter-mapping>

猜你喜欢

转载自blog.csdn.net/qq_27163329/article/details/81676559
今日推荐