首先是目录的说明:
-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中的传入参数用#{成员名}来书写即可。
最后配上一张流程图。