Bootstrap

Spring MVC+Maven 实现同一项目的前端和后台交互

在做前端和后台交互时,首先得有一个建立完毕的spring MVC项目。这里我以Maven+Spring MVC的HelloWord工程来示例,当然你也可以在你已有的Spring MVC工程下进行操作。

建立Spring MVC的HelloWord工程的步骤请参考文章:手把手教你创建一个Maven+Spring MVC的HelloWorld

Spring MVC的HelloWord工程的源码下载:http://download.csdn.net/detail/u012660464/9695653

下面记录下如何在前端后台之间传递参数。


步骤一、修改项目中的web.xml 。(如已符合条件则忽略此步)

样例

<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
	 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
	version="2.4">
	

步骤二、在项目中的pom.xml文件中添加jstl依赖。


 <!-- 为了在jsp页面能引用jstl -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>


在jsp页面中会进行引用,引用示例如下:



步骤三、在项目中的pom.xml文件中添加关于httpServlet的依赖。
<!-- 为了在controller类中使用httpServletRequest -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
		</dependency>


在controller类中会进行引用,引用示例如下:



步骤四、建立数据对应实体类,这里建立User。

package com.springmvc.model;  //新建了一个包

import java.util.List;

/**
 * 用户实体类
 */
public class User {

	private int id; //用户id

	private String name; //用户姓名

	private String sex; //性别

	private List<String> hobbyList; //爱好

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public List<String> getHobbyList() {
		return hobbyList;
	}

	public void setHobbyList(List<String> hobbyList) {
		this.hobbyList = hobbyList;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", hobbyList=" + hobbyList + "]";
	}
}

步骤五、在Controller中编写方法——查看信息功能。

 查看:方式1



//查看方式1:本方法将处理 /hello/view?userId=123 形式的URL
	@RequestMapping(value="/view", method=RequestMethod.GET)
	public String viewUser(@RequestParam("userId") Integer userId,
			Model model) {

		//获取数据
		User user=getUserById(userId);

		//设置数据返回给前端
		model.addAttribute(user);

		return "view_user";
	}

 查看:方式2



//查看方式2:本方法将处理 /hello/view2/123 形式的URL
	@RequestMapping("/view2/{userId}")
	public String viewUser2(@PathVariable("userId") Integer userId,
			Map<String, Object> model) {

		//获取数据
		User user=getUserById(userId);

		model.put("user",user);

		return "view_user";
	}

 查看:方式3



	//查看方式3:本方法将处理 /hello/view3?userId=123 形式的URL
	@RequestMapping("/view3")
	public String viewUser3(HttpServletRequest request) {

		//传统方式获取userId,类似Servelet的doGet方法
		Integer userId = Integer.valueOf(request.getParameter("userId"));

		//获取数据
		User user=getUserById(userId);

		request.setAttribute("user",user);

		return "view_user";
	}


注意:上述的返回类型是字符串,返回值就是所对应的jsp页面的页面名。


getUserById方法:

	/**
	 * 产生数据源,模拟根据 id 查找数据
	 * 
	 * 本来应该是从数据库中查询的,这里为了方便,使用假数据
	 */
	public User getUserById(Integer userId) {

		User user=new User();

		user.setId(userId);
		user.setName("张三"+userId);
		user.setSex("男");

		List<String> hobbies=new ArrayList<String>();
		hobbies.add("打篮球"+userId);
		hobbies.add("唱歌"+userId);
		hobbies.add("听音乐"+userId);
		user.setHobbyList(hobbies);

		return user;
	}

步骤六、在view文件夹下的编写查看用户信息的jsp页面 : view_user.jsp。




@view_user.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>

<!-- 引用jstl-->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!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>
	<!-- 使用了EL表达式 -->
	<p>编号 : ${user.id}</p>
	<p>姓名 : ${user.name}</p>
	<p>性别 : ${user.sex}</p>

	<p>爱好 :</p>

	<ol start="1">
		<!-- 使用了JSTL表达式做循环操作 -->
		<c:forEach items="${user.hobbyList}" var="hobby">
			<li>${hobby}</li>
		</c:forEach>
	</ol>
</body>
</html>

步骤七、运行项目,验证查看功能

 查看:方式1



 查看:方式2




查看:方式3





步骤八、在Controller中编写方法——添加保存功能

	//定位到编辑信息界面 ,/hello/user?add=true
	@RequestMapping(value="/user", method = RequestMethod.GET, params = "add")
	public String createCourse(){
		return "edit_user"; //提交用户信息的界面:edit_user.jsp
	}

	/**
	 * 编辑界面的表单响应方法
	 *  保存信息,  /hello/save
	 * @param user  注意:这里直接通过实体类对象来接收页面表单的参数
	 *            加了@ModelAttribute注解来实现,但是表单中提交的name必须和User类的属性名相同才能映射
	 * @return
	 */
	@RequestMapping(value="/save", method = RequestMethod.POST)
	public String  doSave(@ModelAttribute User user,Model model){		

		log.debug("Info of Course:");
		log.debug(ReflectionToStringBuilder.toString(user));
		
		//在此进行业务操作,比如数据库持久化
		user.setId(234);
		
		System.out.println(user.toString());
		
		//处理方式一 : 重定向查看页面,相当于刷新,不过这里因为填充了假数据,不能真正的看到刚刚添加的信息
//		return "redirect:view2/"+user.getId();
		
		//处理方式二 : 给前端设置参数,直接返回给页面,可查看刚刚添加的信息 
		model.addAttribute("user",user);
		return "view_user";
	}

注意:这个方法里面应该是写保存功能,保存进数据库。这里未涉及数据库,则直接返回了。


步骤九、在view文件夹下的编写保存用户信息的jsp页面 : edit_user.jsp。


@edit_user.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!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>
	<div id="main">
		<div class="newcontainer" id="course_intro">
			<!-- enctype=multipart/form-data: 表示不对字符编码。 -->
			
			<form name="mainForm"
				action="<%=request.getContextPath()%>/hello/save"   
				method="post" enctype="multipart/form-data">  	
				<div>
					<span>姓名:</span><input type="text" id="user_name" name="name">
				</div>
				<div>
					<span>性别:</span><input type="text" id="user_sex" name="sex">
				</div>
				<div>
					<span>爱好:</span><input type="text" id="user_hobbyList"
						name="hobbyList">
				</div>
				<div>
					<button type="submit">提交</button>
				</div>
			</form>
		</div>
	</div>
</body>
</html>

步骤十、运行项目,验证保存功能


注:参数add非必须,不想要可以在方法参数中去掉。


所对应的访问页面是:



前端提交的action:



定位到后台的doSave方法:



这个方法又返回查看页面,也就是提交后的结果:




至此,则实现了前端和后台进行数据交互的小例子,模拟实现了查询和保存功能。


源码下载





;