搭建SpringMVC框架

1.创建web项目

  1. 打开eclipse,新建Dynamic Web Project工程,注意Dynamic web module version 选择2.5
  2. 删除src,右键选择Source Folder ,创建四个名字分别为src/test/java、src/test/resource、src/main/java、src/main/resource的文件夹。
  3. springmvc集成CMS框架 springmvc框架搭建_html

  4. 拷贝需要的jar包

springmvc集成CMS框架 springmvc框架搭建_Sping_02

2. 配置文件

  1. 在src/main/resource文件夹上右键,创建新的xml文件,下一步点击next,在此命名为application后finish,创建完成 。
  2. springmvc集成CMS框架 springmvc框架搭建_java_03

  3. 在application.xml的页面下方点击namespace勾选context和mvc两个选项。
  4. springmvc集成CMS框架 springmvc框架搭建_spring_04

  5. 新建一个Service文件,位置和名称如下图
  6. 在新建的application.xml文件中写入代码
<bean id="userInfoService" class = "com.jd.userinfo.UserInfoService"></bean>
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>

其中,

<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>

表示如果请求没有任何一个Controller中的某一个方法处理,则交给Web服务器默认Servlet处理。

  1. 测试
  1. 新建测试类

    Test测试类中的代码如下
public class Test {
	public static void main(String[] args) {
		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
		//开辟容器,创建userinfoService对象并扫描application.xml里的配置
		Object object = applicationContext.getBean("userInfoService");
		System.out.println(object);//输出对象名称
		applicationContext.close();
	}
}

运行此java类,控制台输出

springmvc集成CMS框架 springmvc框架搭建_java_05


黑色字体部分表明已经获取到了对象

  1. 上述第4点的代码是逐个获取对象,这里将其删去,选择可以获取一个包内的多个对象的方法,代码如下
<context:component-scan base-package="com.jd"></context:component-scan>

代码表示,指定base-package开头的包自动实例化,注意包内service文件必须添加Controller,Component,Service注解。这里完成批量操作,包内凡是加入了上述指定注解的类都会自动实例化(创建对象)并放到容器里。

  1. 在测试类中,主动开辟容器创建对象,开发时,配置程序加载时自动创建对象
    在WebContent/WEB-INF/web.xml中进行配置,添加如下一段代码
<servlet>
  		<servlet-name>DispatcherServlet</servlet-name>
  		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  		<init-param>
  			<param-name>contextConfigLocation</param-name>
  			<param-value>classpath:application.xml</param-value>
  		</init-param>
  		<load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
  		<servlet-name>DispatcherServlet</servlet-name>
  		<url-pattern>/</url-pattern>
  </servlet-mapping>

代码说明:

1)

org.springframework.web.servlet.DispatcherServlet可以在

springmvc集成CMS框架 springmvc框架搭建_html_06


选中,右键选择Copy Qualified Name,得到servlet路径名;

2)

<load-on-startup>1</load-on-startup>

设置值为 1 ,表示servlet对象在tomcat启动的时候创建对象
3)

<init-param>
  	<param-name>contextConfigLocation</param-name>
  	<param-value>classpath:application.xml</param-value>
</init-param>

contextConfigLocation 参数的定义了要装入的 Spring 配置文件。
4)

<servlet-mapping>
  		<servlet-name>DispatcherServlet</servlet-name>
  		<url-pattern>/</url-pattern>
</servlet-mapping>

加上"/"代表此Servlet拦截所有请求。

  1. 过程总结
    1 配置的servlet,随着Tomcat的启动直接创建对象,对象创建完之后直接执行servlet里重写的的init方法,init方法加载classpath对应xml文件,在此例子中相当于执行了new ClassPathXmlApplicationContext(“application.xml”)方法,创建一个容器,并开始扫描classpath的目标:application.xml,将扫描到的加注解的放到容器里。

3.项目实例

  1. 新建web项目,按照第二部分进行配置
  2. 项目运行逻辑
(1)load-on-startup:服务器启动时创建Servlet对象
(2)获取contextConfigLocation值
(3)classpath:application.xml:创建Spring容器+实例化类
(4)若该类中含有@controller注解,则将该类中方法上@RequestMapping中的value值添加到Map集合中
(5)任何一个请求过来,就与Map集合中的已有的Servlet匹配
(6)如果在Map集合中没找到,不用等待,就用默认Servlet处理。
  1. 在src/main/java中添加一个package,名字叫做com.jd.userinfo,在其中添加一个Class类,代码如图所示:
package com.jd.userinfo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class UserInfoController {
	
	@RequestMapping(value="userinfo/login.do")
	public String login(String userName,String password) {
		System.out.println(userName+","+password);
		return "success";
	}
}
  1. 在WebContent直接目录下不会显示页面,因此WEB-INF目录下的文件安全,所以在其目录下添加文件夹view,添加login.jsp和success.jsp,fail.jsp三个jsp文件。

login.jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
%>
<%
String path = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
pageContext.setAttribute("path",path); 
%>
<!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>Insert title here</title>
</head>
<body>
		<form action="<%=path %>./userinfo/login.do" method="post">
			<input name="userName"/>
			<input type="password" name="password"/>
			<input type="submit" value="登陆"/>
		</form>
</body>
</html>

success.jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
OK
</body>
</html>

fail.jsp代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
NO
</body>
</html>
  1. 配置application.xml文件
<context:component-scan base-package="com.jd" ></context:component-scan>

<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>

<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/WEB-INF/view/"></property>
	<property name="suffix" value=".jsp"></property>
</bean>

其中,property两个标签,分别为前缀和后缀,返回来的success/fail通过拼接,返回到对应的页面。

4.在src/main/java中com.jd包中新建包index,在其中添加一个Class类LoginController,代码如图所示

package com.jd.index;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class LoginController {
	@RequestMapping("index/index.do")
	public String index() {
		return "login";
	}
}

添加服务器,添加项目,启动tomcat,访问项目

输入账号密码后点登陆

springmvc集成CMS框架 springmvc框架搭建_html_07


成功访问指定页面

springmvc集成CMS框架 springmvc框架搭建_springmvc集成CMS框架_08


同时Eclipse控制台输出登陆用的用户名和密码

springmvc集成CMS框架 springmvc框架搭建_springmvc集成CMS框架_09

登陆成功后进入success.jsp,但显示出来userName和password,所以在login.jsp页面更改请求为post保证安全,不显示姓名和密码

<form action="${path }userinfo/login.do" method="post">

因为此时login.jsp是post请求,而UserInfoController中的@RequestMapping(value="/userinfo/login.do",method=RequestMethod.POST)
默认Get请求,所以将代码改成上述代码,保证请求匹配。

至此,项目基本框架搭建完成。

4. 完善项目

1.链接数据库

2.添加Service层和Dao层,丰富项目

3.根据输入用户名和密码的匹配性,正确进入success.jsp,失败进入fail.jsp

结构如下:

springmvc集成CMS框架 springmvc框架搭建_html_10


相关代码如下:

User InfoDao.java

package com.jd.userinfo.imp;

import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.stereotype.Component;

import com.jd.tool.db.DBTool;
import com.jd.tool.db.IRowMapper;
import com.jd.userinfo.IUserInfoDao;
@Component
public class UserInfoDao implements IUserInfoDao {
	public boolean login(String userName, String password) {
		String sql = "select userName from user_info where userName = ? and password = ?";
		class RowMapper implements IRowMapper{
			boolean state;
			public void rowMapper(ResultSet resultSet) {
				try {
					if(resultSet.next()) {
						state = true;
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		RowMapper rowMapper = new RowMapper();
		new DBTool().select(sql, rowMapper,userName,password);
		return rowMapper.state;
	}
}

IUserInfoDao:

package com.jd.userinfo;

public interface IUserInfoDao {
	boolean login(String userName,String password);
}

UserInfoService:

package com.jd.userinfo.imp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jd.userinfo.IUserInfoDao;
import com.jd.userinfo.IUserInfoService;
@Service
public class UserInfoService implements IUserInfoService {
	@Autowired
	private IUserInfoDao UserInfoDao;
	public boolean login(String userName, String password) {
		return UserInfoDao.login(userName, password);
	}
}

IUserInfoSevice:

package com.jd.userinfo;

public interface IUserInfoService {
	boolean login(String userName,String password);
}

UserInfoController:

package com.jd.userinfo;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class UserInfoController {
	
	@Autowired
	private IUserInfoService userInfoService;
	
	@RequestMapping(value="userinfo/login.do",method=RequestMethod.POST)
	public String login(String userName,String password,HttpServletRequest request) {
		System.out.println(userName+","+password);
		if(userInfoService.login(userName, password)) {
			request.getSession().setAttribute("userName", userName);
			return "success";
		}
		return "fail";
	}
}