学生管理系统:实现了本机下登录、注册以及登录后对数据库的增删改查。
工具:eclipse,tomcat7.0,PLSQL。
技术:ssm框架,Ajax,js,jquery。
1.配置文件。先上两张我的项目结构图
接下来是导入相关jar包,需要在Maven的官网上查找依赖然后再pom.xml中导入。
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- 1、servlet相关的配置 begin -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- 1、servlet相关的配置 end -->
<!-- 2、springmvc相关的配置 begin -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 2、springmvc相关的配置 end -->
<!-- 3、数据库连接池、oracle数据库驱动程序 begin -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>oracle.jdbc.driver</groupId>
<artifactId>OracleDriver</artifactId>
<version>6</version>
</dependency>
<!-- 3、数据库连接池、oracle数据库驱动程序 end -->
然后是WEB-INF下web.xml的配置
<!-- 配置使用SpringMVC框架 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring_mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- -->
<url-pattern>*.action</url-pattern>
<!-- 如果是RESTful的使用,则值配置为“/”
<url-pattern>/</url-pattern>-->
</servlet-mapping>
<!-- 1、引入spring框架 begin -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--<param-value>/WEB-INF/classes/config/spring_beans.xml</param-value>-->
<param-value>classpath:config/spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 1、引入spring框架 end -->
<!-- 配置使用SpringMVC框架 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:config/spring_mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- -->
<url-pattern>*.action</url-pattern>
<!-- 如果是RESTful的使用,则值配置为“/”
<url-pattern>/</url-pattern>-->
</servlet-mapping>
<!-- 1、引入spring框架 begin -->
<context-param>
<param-name>contextConfigLocation</param-name>
<!--<param-value>/WEB-INF/classes/config/spring_beans.xml</param-value>-->
<param-value>classpath:config/spring.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 1、引入spring框架 end -->
spring.xml中配置数据库连接池,以及Mybatis中最重要的sqlSessionFactory,当然还有sqlsession。
<!-- 指定数据源信息文件的位置 -->
<context:property-placeholder location="classpath:config/db.properties"/>
<!-- 配置数据源 -->
<p:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<p:property name="username" value="${jdbc.username}" />
<p:property name="password" value="${jdbc.password}" />
<p:property name="url" value="${jdbc.url}" />
<p:property name="driverClassName" value="${jdbc.driver}" />
</p:bean>
<!-- 配置sqlSessionFactory,需要使用dataSource和mybatis的配置文件 -->
<p:bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<p:property name="dataSource" ref="dataSource" />
<p:property name="configLocation" value="classpath:config/mybatis.xml"/>
</p:bean>
springMVC.xml,拦截器的作用会在后面讲到。
<!-- 注解方式开发,只需要配置下面的标记 -->
<mvc:annotation-driven />
<context:component-scan base-package="com.neusoft" />
<!-- 配置全局拦截器 实现 不登录不能访问-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.neusoft.controller.PowerInterCeptor"/>
</mvc:interceptor>
</mvc:interceptors>
Mybatis.xml,设置settings属性为空NULL时,才知道在根目录下放什么标签是有顺序的,长记性了。
<configuration>
<!--设置Oracle数据库中数据空值,顺序不能随便放 -->
<settings>
<setting name="jdbcTypeForNull" value="NULL"/>
</settings>
<typeAliases>
<package name="com.neusoft.entity" />
</typeAliases>
<!-- 引入映射文件的路径 -->
<mappers>
<mapper resource="com/neusoft/entity/UserMapper.xml" />
</mappers>
</configuration>
2.好了,配置好环境后,接下来就是在jsp中做设计了,说实话,js,jQuery在网上能查到的资源我都能写出来,比如说我后面讲到的数据js效验,Bootstrap3,layuideng就CV大法。下面是我设计的简约大方的界面。
实现的功能2.1:单击会改变的验证码,我在网上找了一个生成验证码的类,把它放到控制层了,总觉得就我一个人会这么做
<div id="code"> 验证码:<input type="text" name="code" placeholder="请输入后面图片中的验证码"/>
<img src="${pageContext.request.contextPath }/codeServlet.action"
onclick="this.src=this.src+'?dump='+new Date()"" id="codeImg"/></div><br/>
实现的功能2.2:Ajax时间,在焦点用户名框时,触发时间,后台查到此用户用户名会提示验证码登录,否则,登陆按钮无效,隐藏验证码,只能注册。
$(function(){
$("[name='uname']").blur(function(){
$.ajax({
method:"post",
data:"uname="+$(this).val(),
url:"<%=request.getContextPath()%>/user.action?act=queryByUname",
success:function(data){
//alert("data=" +data);
if(data=="true"){//重复
var uspan = document.getElementById("uspan");
uspan.innerHTML = "可直接登录 ";
$("#code").show();
}else{
var uspan = document.getElementById("uspan");
$("#login").attr("disabled","true");//
uspan.innerHTML = "需要注册 ";
$("#code").hide();
}
}
});
});
})
实现的功能2.3:对的,就是对用户名和密码进行控制。通过js(jQuery)实现,直接贴代码
<script src="<%=request.getContextPath()%>/js/jquery-3.2.1.min.js"></script>//这个千万不能忘了哦
<script type="text/javascript">
//前台效验和验证码功能算是基本实现。明天实现注册功能,和注册后修改资料
function run(){
//效验用户名
var uname = $("[name='uname']").val();
if(uname == "" || uname.length == null){
var uspan = document.getElementById("uspan");
uspan.innerHTML = "用户名不能为空";
return false;
}
//效验密码
var pass = $("[name='pass']").val();
if(pass == null || pass.length <3){
var pspan = document.getElementById("pspan");
pspan.innerHTML = "密码必须大于3位";
return false;
}
}
</script>
3.MVC的一次完整的过程,这里我就拿一个修改过程做例子。上图上代码。
首先我先模糊查询含有t的uname,接着直接单击操作中修改,跳转到修改页面,删除会让你确认是否确定,下面先给jsp代码
<td>
<fmt:formatDate value="${u.birthdate }" pattern="yyyy-MM-dd"/> <!-- x显示的日期格式,需要引入fmt标签-->
</td>
<td>
<a href="${pageContext.request.contextPath }/user.action?act=toUpdate&id=${u.id}">修改</a>
<a href="${pageContext.request.contextPath }/user.action?act=delete&id=${u.id}"
onclick="return confirm('您确认要删除记录么?')">删除</a>
</td>
@Controller层接受并处理,在这里说下方法的三种返回值,void做跳转(转发、重定向),String直接返回jsp或者下一个方法,还有ModelAndView类型,通过对象方法进行操作等,在这里,我显示利用传过来的id值回显给修改界面,让用户更直观的直到要修改的是什么信息(jsp页面隐藏了id值)。
@RequestMapping(value = "/user", params = "act=toUpdate")
public String doToUpdate(HttpServletRequest req, User u) {
String str = "/user/update.jsp";
User u2 = service.queryById(u.getId());
req.setAttribute("u", u2);
return str;
}
@RequestMapping(value = "/user", params = "act=update")
public String doUpdate(HttpServletRequest req, User u) {
String str = "/user/update.jsp";
int i = service.update(u);
if (i > 0) {
req.setAttribute("msg", "update ok");
str = "/user/query.jsp";
} else {
req.setAttribute("msg", "update error");
req.setAttribute("u", u);
}
return str;
}
@Controller层调用了@Service层再进入@Repository层,dao层在连接了Mybatis后不需要在方法中再连接数据库。如下所示。
@Repository
public class UserDAO extends SqlSessionDaoSupport implements UserDAOI {
//注意:需要手动在这里覆盖 setSQLSessionFactory()的方法,并手动@Autowired
@Override @Autowired
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
// TODO Auto-generated method stub
super.setSqlSessionFactory(sqlSessionFactory);
}
@Override
public int update(User u) {
return getSqlSession().update("user.update", u);
}
然后再Mapper中写sql语句,下面是我的。
<mapper namespace="user">
<update id="update">
update t_user
<set>
<if test="uname!=null and uname!=''">
uname=#{uname},
</if>
<if test="pass!=null and pass!=''">
pass=#{pass},
</if>
<if test="realname!=null and realname!=''">
realname=#{realname},
</if>
<if test="birthdate!=null">
birthdate=#{birthdate},
</if>
</set>
where id=#{id}
</update>
</mapper>
总结下吧。这是我的第一个博客,主要是想展示一下自己的成果,毕竟在没接触之前,ssm框架对我来说是那么高大上,在浏览器上展现的很少,在后台真的做了很多,比如说忘了放的拦截器,不登录就不能访问,利用登录后在session中存用户名判断。
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
// TODO Auto-generated method stub
//1.获取请求路径,判断是否为公共url 如果是,放行,
String path=arg0.getRequestURI();
//System.out.println("path="+path);
if(path.indexOf("/login.action")!=-1){
return true;
}
if(path.indexOf("/codeServlet.action")!=-1){
return true;
}
if(path.indexOf("/zhuce.action")!=-1){
return true;
}
if(path.indexOf("/user.action")!=-1){
return true;
}
//2.获取session中的uname 如果非空 放行
Object uname=arg0.getSession().getAttribute("uname");
if(uname!=null&uname!=""){
return true;
}else{
//3.拦截 前两个没return true
arg0.setAttribute("msg", "不登录不能访问");
arg0.getRequestDispatcher("/login.jsp").forward(arg0, arg1);}
return false;
}
}
还有非常方便的EL表达式。学了ssm框架后,接下来的目标是ssh框架,还有spring Boot,接触的越多就越知道自己的不足。
还有希望能找到一份8个月左右的全职实习。最完美的结局就是我的能力和潜力被公司认可。加油!