1,搭建开发环境:
1)创建项目:crm-project
设置JDK.
创建工程:crm
补全目录结构:
设置编码格式:UTF-8
2)添加jar包:添加依赖---参考课件.
3)添加配置文件:参考课件.
4)添加静态页面资源:
为何将静态资源部署到idea中maven的webapp框架下的webapp目录下:maven webapp框架中的webapp目录,再将项目部署到tomcat服务器下面时,会直接将此目录下的文件拷贝到tomcat的webapps目录下,所以在idea中编写web项目时,静态页面资源直接放置在webapp目录下即可
项目部署到Tomcat服务器上时,会将项目文件添加到tomcat服务器webapps下面。(webapps下面会部署很多项目)
目录结构:
webapps
|->stumgr(其他项目)
|->crm(本次项目)
|->.html,.css,.js,.img test.jsp
|->WEB-INF(下面有三大件,即web.xml classes lib)
|->web.xml(核心配置文件)
|->classes(我们写好的java程序编译好的class文件)
|->lib(放jar包,在项目部署时idea和mave会将仓库里的使用到jar包全部拷贝进去)
**web应用根目录下的内容都是不安全的,外界可以通过url直接访问;
所以,一般为了数据的安全,都会把页面放到WEB-INF下,因为WEB-INF目录下的资源是受保护的,外界不能直接访问,但是内部的java程序例如controller可以访问,controller编译的class文件在WEB-INF目录下,进而可以访问WEB-INF目录下的文件。即外界访问的整个的流程就是,外界访问controller的url,进而访问到controller,进而访问到WEB-INF下的一些文件。进而又引入一个问题,如果外界知道controller的url,那么会不会直接访问到WEB-INF目录下的文件呢?答案是会的,但是我们可以对用户进行验证,通过拦截器等进行访问验证,进而对无权限的账号进行拦截。
在部署到Tomcat上时出现了如下问题:
解决办法:将web.xml文件中的监听器部分注释掉(解决问题就解决掉提出问题的人)
做项目的功能时,先做被依赖的功能,例如系统管理功能和业务实现功能,就先做系统管理功能
首页功能
usercontroller类:
@Controller
public class UserController {
/**
* url要和controller方法处理完请求之后,响应信息返回的页面的资源目录保持一致
*/
@RequestMapping("/settings/qx/user/toLogin.do")
public String toLogin(){
//请求转发到登录页面
return "settings/qx/user/login";
}
}
登录功能
1,同步请求和异步请求的区别:
同步请求:浏览器窗口发出的请求,响应信息返回到浏览器窗口,所以会进行全局刷新。
异步请求:ajax发出的请求,响应信息返回到ajax的回调函数,既可以进行全局刷新,也可以进行局 部刷新。
小结:如果需要进行全局刷新,推荐使用同步请求,当然也可以使用异步请求;
如果需要进行局部刷新,只能使用异步请求;
如果既可能进行全局刷新,也可能进行局部刷新,也是只能使用异步请求。
异步请求,需要的参数根据usercontroller要执行的操作需要来提供。
浏览器发送请求,接受请求的controller层应该如何创建以及是否要在原来的controller层上加方法,具体看处理后的响应信息返回到哪个页面,一个页面如果占一个独立的资源目录,那这个资源目录对应一个controller类
controller只进行流程控制,不处理具体逻辑,usercontroller层接收到参数以后决定调用哪个service层
一张表对应一个实体类,对应一个dao层(mapper层),对应一个service层
2,mybatis逆向工程:
创建mybatis逆向工程,生成jar包,供crm项目使用。
1)简介:根据表生成mapper层三部分代码:实体类,mapper接口,映射文件。
2)使用mybatis逆向工程:
a)创建模块:crm-mybatis-generator
b)添加插件:(创建过程中 maven中引入依赖是指引入是jar包,jar包只能是被其他程序去调。插件:是独立的程序,可以独立运行)
<!--myBatis逆向工程插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
c)添加配置文件:
数据库连接信息
代码保存的目录
表的信息
d)运行mybatis的逆向工程,根据指定表生成java代码,保存到指定的目录中。
前面注释掉监听器的代价。。。。在进行网页登录时有了如下一模一样的bug。。
想要把控制层的数据传递给页面,都是通过作用域来传
1,把控制层(controller)代码中处理好的数据传递到视图层(jsp),使用作用域传递:
pageContext:用来在同一个页面的不同标签之间传递数据。
request:在同一个请求过程中间传递数据。
session: 同一个浏览器窗口的不同请求之间传递数据。
application:所有用户共享的数据,并且长久频繁使用的数据。
在网站地址栏中想查询服务器中的数据,先在地址栏中输入需要的controller对应的的url,controller调用service层方法等操作,查出来之后返回到controller,controller利用request,set等方法将数据传递给
用户登录时,如何验证信息的:验证信息时,以传来的用户名且密码为条件,查询数据库,未查到就返回null的user,查到就返回相应的信息user,mapper文件中如下查询语句进行查询。
<select id="selectUserByLoginActAndPwd" parameterType="map" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from tbl_user
where login_act=#{loginAct} and login_pwd=#{loginPwd}
</select>
十天免登录功能实现(cookie)
访问:login.jsp---->后台:.html:如果上次记住密码,自动填上账号和密码;否则,不填。
如何判断上次是否记住密码?`
--上次登录成功,判断是否需要记住密码:如果需要记住密码,则往浏览器写cookie;否则,删除cookie。而且cookie的值必须是该用户的loginAct和loginPwd
--下次登录时,判断该用户有没有cookie:如果有,则自动填写账号和密码;否则,不写。而且填写的是cookie的值.
----->浏览器显示
在usercontroller中写入cookie
//如果需要记住密码,则往外写cookie
if("true".equals(isRemPwd)){
Cookie c1=new Cookie("loginAct",user.getLoginAct());
c1.setMaxAge(10*24*60*60);
response.addCookie(c1);
Cookie c2=new Cookie("loginPwd",user.getLoginPwd());
c2.setMaxAge(10*24*60*60);
response.addCookie(c2);
}else{
//把没有过期cookie删除
//因为后台不能去删除用户已经记录的cookie,
所以再重新提交一次用来覆盖原来的cookie,向用户端保存时间为0,
账号密码实际值无所谓的cookie,但是要覆盖的属性的属性名要一致
Cookie c1=new Cookie("loginAct","1");
c1.setMaxAge(0);
response.addCookie(c1);
Cookie c2=new Cookie("loginPwd","1");
c2.setMaxAge(0);
response.addCookie(c2);
}
获取cookie
使用EL表达式获取cookie:
${cookie.loginAct.value}
${cookie.loginPwd.value}
安全退出
登录验证:
利用拦截器进行拦截
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//如果用户没有登录成功,则跳转到登录页面
HttpSession session=httpServletRequest.getSession();
User user=(User) session.getAttribute(Contants.SESSION_USER);
if(user==null){
//在controller中可以借助框架直接重定向,在这个里边只能调用方法进行重定向
//重定向时,url必须加项目的名称。这时候不在框架里,不能用视图解析器,要自己加前后缀
httpServletResponse.sendRedirect(httpServletRequest.getContextPath());
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}