1、新建一个Web项目
- 建立一个web项目,版本选择2.5
- 删除src,右键选择Source Folder ,创建四个名字分别为
src/test/java
、src/test/resource
、src/main/java
、src/main/resource
的文件夹 - 拷入如图所示的jar包
2、配置文件
- 在web.xml中创建Spring容器并向其中添加对象
- 在
src/main/resource
中 右键选择Spring Bean Configuration File创建一个名字为application.xml的文件。
- 在application.xml的页面下方点击namespace勾选
- 在application.xml中写入如下代码
解释:
1、
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
点击如图所示的DispatcherServlet.class,右键选择Copy Qualified Name,得到servlet路径名;
2、写在DispatcherServlet中,代表当Tomcat启动时此servlet调用init()方法,加载classpath:application.xml,产生一个Spring容器,并且开始扫描,将对象放入容器中。
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:application.xml</param-value>
</init-param>
3、代表在服务器启动时创建Servlet对象。
<load-on-startup>1</load-on-startup>
4、 加上"/"
代表此Servlet拦截所有请求。
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
5、
(1)
指定base-package开始的包自动实例化,注意:包内类必须添加有 Controller、Service、Component类注解
<context:component-scan base-package="com.jd"></context:component-scan>
例:扫描以“com.jd”开头的包,并且使包里面的加有以上三个注解中任意一个注解的类 创建对象。
(2) 如果请求没有任何一个Controller中的某一个方法处理,则交给Web服务器默认Servlet处理。
<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>
6、逻辑:
(1)load-on-startup:服务器启动时创建Servlet对象
(2)获取contextConfigLocation值
(3)classpath:application.xml:创建Spring容器+实例化类
(4)若该类中含有@controller注解,则将该类中方法上@RequestMapping中的value值添加到Map集合中
(5)任何一个请求过来,就与Map集合中的已有的Servlet匹配
(6)如果在Map集合中没找到,不用等待,就用默认Servlet处理。
3、创建模块
- 在
src/main/java
中添加一个package,名字叫做com.jd.userinfo,在其中添加一个Class类,代码如图所示: - 在WebContent目录下添加两个jsp文件,如图所示出现错误,是因为没有引入jar包,在lib目录下引入
servlet-api.jar
即可。 - 在application.xml中写入如下代码
分析:上面的bean语句是为了在处理数据后返回字符串自动找到所需要的资源,找到以“/WEB-INF/view/”开头的和以“.jsp”结尾的资源。
- 因为WEB-INF目录下的文件很安全,所以可在其目录下添加文件夹view,将login.jsp和success.jsp添加进去。
此时无法访问页面,因为在WebContent直接目录下没有显示页面 - 在WebContent目录下创建一个index.jsp,再创建一个IndexController
- 此时运行程序,登陆页面如图所示
登陆成功后进入success.jsp,但显示出来userName和password,所以在login.jsp页面加上
<form action="${path }userinfo/login.do" method="post">
改成post请求保证安全,不显示姓名和密码 - 因为此时login.jsp是post请求,而UserInfoController中的
@RequestMapping(value="/userinfo/login.do",method=RequestMethod.POST)
默认Get请求,所以将代码改成上述代码,保证请求匹配。
解释
当Controller发送返回值“success”后,进入此配置进行拼接,找到正确的路径,进入成功页面。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>//前缀
<property name="suffix" value=".jsp"></property>//后缀
</bean>
4、搭建框架
- 如图所示,创建工具类与数据库连接
- 创建userinfo中的Dao层和Service层,实现登陆
- 在UserInfoController.java中进行处理
- 创建fail.jsp文件,当登录失败时返回的页面
IUserInfoService代码
package com.jd.userinfo;
public interface IUserInfoService {
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);
}
}
IUserInfoDao代码
package com.jd.userinfo;
public interface IUserInfoDao {
boolean login(String userName,String password);
}
UserInfoDao代码
package com.jd.userinfo.imp;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.stereotype.Repository;
import com.jd.tool.db.DBTool;
import com.jd.tool.db.IRowMapper;
import com.jd.userinfo.IUserInfoDao;
@Repository
public class UserInfoDao implements IUserInfoDao{
public boolean login(String userName, String password) {
String sql = "select user_name from user_info where user_name=? 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();
try {
DBTool.select(sql, rowMapper, userName,password);
} catch (SQLException e) {
e.printStackTrace();
}
return rowMapper.state;
}
}
UserInfoControlle代码
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) {
if (userInfoService.login(userName, password)) {
request.getSession().setAttribute("userName", userName);//防止非法登陆
return "success";
}
return "fail";
}
}
解释:
1、@Component、@Repository、@Controller、@Service
联系application.xml中的此行代码
<context:component-scan base-package="com.jd"/>
将自动扫描路径下面的包,如果一个类带了以上任意一个注解,将自动添加到Spring容器中。
2、@Autowired:代表在Spring MVC框架中,加上次注解,相当于创建对象。