首先是目录的说明:
-config
-src
-WebRoot
Config:里面是SpringMVC和Mybatis的相关初始化设定,一般除了配置下自己电脑的数据库连接方式,不需要做额外设定。
config
-mybatis
-spring
-db.properties
-log4j.properties
所以,这里只需要对db.properties进行设置,我这里是postgres,所以设定如下:
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/natsu
jdbc.username=postgres
jdbc.password=postgres
先不看src,里面当然就是java的源代码。
先看WebRoot文件夹,这个文件夹的内容,就会在tomcat上运行,包括java编译生成的class文件。
WebRoot
-data
-jquery-easyui-1.5.2
-js
-META-INF
-WEB-INF
-index.html
这里的目录是可以通过URL来直接访问和获取的,而WEB-INF的内容是被保护的,不可直接访问。
所以index.html可以直接通过地址栏里面输入网址来打开。(localhost:8080/工程路径/index.html)
然后为了方便起见,也就可以直接把所有的js,json(data文件夹下),css放置在此,如果放置在WEB-INF下,需要再做别的设定,此处不赘述。
WEB-INF
-classes
-jsp
-lib
-web.xml
这里的WEB-INF已经是web应用编译后的了,所以存在class文件夹,自己只需要建立jsp文件夹,并且把通过.action来访问的页面放置在此即可,lib里面是相关的jar包,记得建立项目时均放置到其中,避免tomcat运行后,出现找不到jar包依赖的错误。
为什么.jsp的页面要放置在WebRoot/WEB-INT/jsp文件夹下,是因为在SpringMVC.xml下做了如下配置:
<!-- 视图解析器 解析jsp页面,默认使用jstl标签,classpath下面得有jstl的包 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置jsp路径的前后缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
目录讲解到此,下面就是src的源代码目录。
-controller
-mapper
-po
-service
不管前面的包是怎么封的,不论如何,到最后一层都是这四个包:controller,mapper,po,service。
先说po:po内简单地说就是方便你来操作数据库的传参和返回值而封装的类,比如这里的Users。当然这里也可以自己建立一些类,目的就是为了方便别的代码的逻辑和编写。
public class Users {
private int id; // 用户ID
private String username;// 用户姓名
private String password;// 用户密码
public int getId() {
return id;
}
...//get&set
public void setPassword(String password) {
this.password = password;
}
}
关于这个po,有自动生成的工具,所以还算是挺方便的。
介绍完了po,下面我们就跟随一个实际需求,来看看整个运行流程。
出发点是位于user.jsp引用的mydemo.js的一段ajax请求:
$('#login').bind('click', function(){
$.ajax({
url: "./loginResult.action",
async: true,
type: "POST",
dataType: "text",//"json",
data: {
username: $("#username").textbox('getValue'),
password: $("#password").textbox('getValue')
},
success: function(result){
if(result=="success"){
$.messager.alert('提示','登陆成功');
$('#loginWindow').window('close');
window.location.reload();
}
else if(result=="fail"){
$.messager.alert('提示',"用户名或者密码错误!");
}
}
})
});
这里发送了username和password给服务器,期望得到一个字符串的返回,来知道登录是否成功。
而请求的URL是 ./loginResult.action
服务器接到这个请求,当然就是去找对应的controller啦。
于是,就在controller里面找到了这货:
@RequestMapping("/login")
public ModelAndView login() throws Exception{
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("index");
return modelAndView;
}
@RequestMapping("/loginResult")
@ResponseBody
public String loginResult(Users user) throws Exception{
Users usersResult = null;
usersResult = usersService.findUser(user);
if(usersResult!=null) return "success";
return "fail";
}
前面那个controller就是为了用于访问WEB-INF下的页面而书写的。
这边重点看后面这个,这里用了@ResponseBody注释,使得返回的字符串会直接写入response里面。
而这里,传入的username和password会自动构成Users对象,而这里在Sercvice下写了个函数来实现返回查询结果,传入的正是User。
那么再往下一层,我们前往Service:
Service
-impl
-UsersService.java
public interface UsersService {
public Users findUserById(int id) throws Exception;
public Users findUser(Users user) throws Exception;
}
Service当中,只提供了接口,而实现在其Impl中。
public class UsersServiceImpl implements UsersService{
@Autowired
private UsersMapper usersMapper;
@Override
public Users findUser(Users user) throws Exception {
Users users = usersMapper.findUser(user);
return users;
}
@Override
public Users findUserById(int id) throws Exception {
Users users = usersMapper.findUsersById(id);
return users;
}
}
而这里可以看到,在@Override的重载代码里面,返回值users就是通过Mapper里面的函数获得的。
这里 usersMapper前面用了@Autowired自动装配,因为事实上,usersMapper也只是个接口,所以要配合它的.xml来完成代码。
mapper
-UsersMapper.java
-UsersMapper.xml
public interface UsersMapper {
// 根据id查询用户信息
public Users findUsersById(int id) throws Exception;
// 根据账号密码查询用户
public Users findUser(Users user) throws Exception;
}
而最后的最后,就是配置.xml里面对应的sql语句了:
<select id="findUser" parameterType="cn.edu.zju.gis.po.Users" resultType="cn.edu.zju.gis.po.Users">
SELECT * FROM USERS WHERE username = #{username} and password = #{password}
</select>
parameterType代表传入的类型 resultType是返回值类型。
这里在SQL中的传入参数用#{成员名}来书写即可。
最后配上一张流程图。