搭建SpringMVC框架
1.创建web项目
- 打开eclipse,新建Dynamic Web Project工程,注意Dynamic web module version 选择2.5
- 删除src,右键选择Source Folder ,创建四个名字分别为src/test/java、src/test/resource、src/main/java、src/main/resource的文件夹。
- 拷贝需要的jar包
2. 配置文件
- 在src/main/resource文件夹上右键,创建新的xml文件,下一步点击next,在此命名为application后finish,创建完成 。
- 在application.xml的页面下方点击namespace勾选context和mvc两个选项。
- 新建一个Service文件,位置和名称如下图
- 在新建的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处理。
- 测试
- 新建测试类
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类,控制台输出
黑色字体部分表明已经获取到了对象
- 上述第4点的代码是逐个获取对象,这里将其删去,选择可以获取一个包内的多个对象的方法,代码如下
<context:component-scan base-package="com.jd"></context:component-scan>
代码表示,指定base-package开头的包自动实例化,注意包内service文件必须添加Controller,Component,Service注解。这里完成批量操作,包内凡是加入了上述指定注解的类都会自动实例化(创建对象)并放到容器里。
- 在测试类中,主动开辟容器创建对象,开发时,配置程序加载时自动创建对象
在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可以在
选中,右键选择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 配置的servlet,随着Tomcat的启动直接创建对象,对象创建完之后直接执行servlet里重写的的init方法,init方法加载classpath对应xml文件,在此例子中相当于执行了new ClassPathXmlApplicationContext(“application.xml”)方法,创建一个容器,并开始扫描classpath的目标:application.xml,将扫描到的加注解的放到容器里。
3.项目实例
- 新建web项目,按照第二部分进行配置
- 项目运行逻辑
(1)load-on-startup:服务器启动时创建Servlet对象
(2)获取contextConfigLocation值
(3)classpath:application.xml:创建Spring容器+实例化类
(4)若该类中含有@controller注解,则将该类中方法上@RequestMapping中的value值添加到Map集合中
(5)任何一个请求过来,就与Map集合中的已有的Servlet匹配
(6)如果在Map集合中没找到,不用等待,就用默认Servlet处理。
- 在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";
}
}
- 在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>
- 配置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,访问项目
输入账号密码后点登陆
成功访问指定页面
同时Eclipse控制台输出登陆用的用户名和密码
登陆成功后进入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
结构如下:
相关代码如下:
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";
}
}