ssm框架整合+Ajax异步验证
SSM框架是目前企业比较常用的框架之一,它的灵活性、安全性相对于SSH有一定的优势。说到这,谈谈SSM和SSH的不同点,这也是企业常考初级程序员的面试题之一。说到这两套框架的不同,主要是持久层框架Hibernate和MyBatis的不同和控制层框架SpringMVC和Struts2的不同。 ? Hibernate和MyBatis的不同主要体现这么几点: 1.自动化和半自动化:Hibernate的SQL语句自动生成不需要程序员编写,而MyBatis需要编写。 2.学习上:Hibernate入门比较难,而MyBatis入门非常容易。 3.可移植性:Hibernate可移植性好,对应不同的数据库通过改变方言可以直接用,而MyBatis可移植性差,对应不同的数据库需要书写不同的SQL语句 4.关系维护上:Hibernate映射关系复杂,而MyBatis相对简单。 5.缓存:Hibernate有更好的二级缓存,可以使用第三方缓存,而MyBatis本身缓存就不好。 ? ? SpringMVC和Struts2的不同点如下: 1.入口不同:SpringMVC的入口是Servlet,Struts的入口是Filter。 2.性能上:spring3?mvc是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在spring3?mvc中,一个方法对应一个request上下文。而struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter?getter方法把request中的数据注入;struts2实际上是通 setter?getter方法与request打交道的;struts2中,一个Action对象对应一个request上下文。?? 3.拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。 4.?设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。 5.SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。 6.Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。 第一步:导包(这一步只要成功,可以说成功了80%) aopalliance.jar aspectjweaver-1.5.4.jar commons-fileupload-1.3.1.jar commons-io-2.4.jar commons-logging-1.1.3.jar fastjson-1.2.13.jar jstl-1.2.jar mail.jar mybatis-3.3.1.jar mybatis-spring-1.2.4.jar mysql-connector-java-5.1.26-bin.jar spring-aop-4.2.3.RELEASE.jar spring-aspects-4.2.3.RELEASE.jar spring-beans-4.2.3.RELEASE.jar spring-context-4.2.3.RELEASE.jar spring-context-support-4.2.3.RELEASE.jar spring-core-4.2.3.RELEASE.jar spring-expression-4.2.3.RELEASE.jar spring-instrument-4.2.3.RELEASE.jar spring-instrument-tomcat-4.2.3.RELEASE.jar spring-jdbc-4.2.3.RELEASE.jar spring-jms-4.2.3.RELEASE.jar spring-messaging-4.2.3.RELEASE.jar spring-orm-4.2.3.RELEASE.jar spring-oxm-4.2.3.RELEASE.jar spring-test-4.2.3.RELEASE.jar spring-tx-4.2.3.RELEASE.jar spring-web-4.2.3.RELEASE.jar spring-webmvc-4.2.3.RELEASE.jar spring-webmvc-portlet-4.2.3.RELEASE.jar spring-websocket-4.2.3.RELEASE.jar ? 第二步:写Spring主配置文件以及MyBatis主配置文件 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 起别名 -->
<typeAliases>
<package name="com.blog.entity"/>
</typeAliases>
</configuration>
? <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd "> <!-- 自动扫描注解 --> context:component-scan base-package="com.blog.service"></context:component-scan> 配置连接池 --> bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"property name="driverClassName" value="com.mysql.jdbc.Driver"property="url"="jdbc:mysql://localhost:3306/blog_002"="username"="root"="password"="1234"</bean> 配置mybatis工厂 ="sqlSessionFactoryBean"="org.mybatis.spring.SqlSessionFactoryBean" ref="dataSource"="configLocation"="classpath:mybatis-config.xml" 注解事务 ="transactionManager"="org.springframework.jdbc.datasource.DataSourceTransactionManager" 开启注解事务 tx:annotation-driven transaction-manager="transactionManager"/> 动态扫描 class="org.mybatis.spring.mapper.MapperScannerConfigurer"="basePackage"="com.blog.mapper"beans> ? 第三步:创建实体类 package com.blog.entity;
public class User {
private Integer Id;
private String email;
private String userName;
private String password;
private Integer power;
public Integer getId() {
return Id;
}
public void setId(Integer id) {
Id = id;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getPower() {
return power;
}
public void setPower(Integer power) {
this.power = power;
}
}
?第四步:创建接口以及SQL映射文件(通过动态代理的方式绑定) package com.blog.mapper;
import org.apache.ibatis.annotations.Param;
import com.blog.entity.User;
public interface UserMapper {
User Login(String email);
User Login2(@Param("email") String email,@Param("password") String password);
}
? <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.blog.mapper.UserMapper">
<select id="Login" parameterType="String" resultType="User">
select * from b_user where email=#{email}
</select>
<select id="Login2" resultMap="logins">
select * from b_user where email=#{email} and password=#{password}
</select>
<resultMap type="User" id="logins">
<id column="Id" property="Id"/>
<result column="email" property="email"/>
<result column="password" property="password"/>
</resultMap>
</mapper>
第五步:创建Service接口以及实现类 package com.blog.service;
import com.blog.entity.User;
public interface UserService {
User Login(String email);
User Login2(String email,String password);
}
? package com.blog.service.impl; import javax.annotation.Resource; org.springframework.stereotype.Service; com.blog.entity.User; com.blog.mapper.UserMapper; com.blog.service.UserService; @Service public class UserServiceImpl implements UserService{ @Resource private UserMapper userMapper; @Override public User Login(String email) { // TODO Auto-generated method stub return userMapper.Login(email); } @Override User Login2(String email,String password) { userMapper.Login2(email,password); } } 第六步:写测试类测试上述方法 com.blog.test; org.junit.Test; org.junit.runner.RunWith; org.springframework.test.context.ContextConfiguration; org.springframework.test.context.junit4.SpringJUnit4ClassRunner; com.blog.mapper.UserMapper; @RunWith(SpringJUnit4ClassRunner.) @ContextConfiguration("classpath:applicationContext.xml") testMapper { @Resource UserMapper userMapper; @Test void testName() throws Exception { User user=userMapper.Login("1933108196@qq.com"); System.out.println(user); } @Test void testName2() Exception { User user=userMapper.Login2("1933108196@qq.com","kangri123"); System.out.println(user.getUserName()); } } 第七步:测试成功后,开始设置web.xml web-app ="http://java.sun.com/xml/ns/javaee"="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> display-name>Demo_Model> 全局配置 --> context-paramparam-name>contextConfigLocationparam-value>classpath:applicationContext.xml> 该监听器主要作用是随tomcat的启动,而加载context中的全局配置文件 listenerlistener-class>org.springframework.web.context.ContextLoaderListener 该过滤器主要作用是处理字符乱码,可拦截所有请求,处理所有乱码filter> filter-name>CharacterEncodingfilter-class>org.springframework.web.filter.CharacterEncodingFilterinit-param>encoding>UTF-8> filter-mappingurl-pattern>/*> servletservlet-name>springmvcservlet-class>org.springframework.web.servlet.DispatcherServlet>classpath:springmvc.xmlservlet-mapping>*.do *.do拦截所有带do的请求,对静态资源放行 / 拦截所有带.jsp的请求,同时对静态资源拦截 /* 拦截所有 --> > welcome-file-list> welcome-file>Login.jspweb-app> 第八步:配置springmvc.xml(与Spring框架无缝整合) <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd ">
<!--扫描Controller层 -->
<context:component-scan base-package="com.blog.controller"></context:component-scan>
<!-- 开启注解 -->
<mvc:annotation-driven/>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
配置完毕后记得添加Controller 相关的类 package com.blog.controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSON;
import com.blog.entity.User;
import com.blog.service.UserService;
@Controller
public class UserController {
@Resource
private UserService userService;
@RequestMapping(value="emailCheck2.do",method=RequestMethod.POST)
public void emailCheck2(String email,HttpServletResponse response,HttpServletRequest request,HttpSession session,Model model) throws IOException{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
User user=userService.Login(email);
if(user!=null){
out.println("邮箱已经存在");
}else{
out.println("邮箱可以使用");
}
out.flush();
out.close();
}
@RequestMapping(value="emailCheck.do",method=RequestMethod.POST)
public void emailCheck(String email,Model model) throws IOException{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
User user=userService.Login(email);
if(user!=null){
out.println("邮箱正确");
}else{
out.println("邮箱错误");
}
out.flush();
out.close();
}
@RequestMapping(value="passCheck.do",String password,Model model) throws IOException{
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
User user=userService.Login2(email,password);
if(user!=null){
out.println("密码正确");
}else{
out.println("密码错误");
}
out.flush();
out.close();
}
@RequestMapping(value="LoginCheck.do",method=RequestMethod.POST)
public String LoginCheck(String email,Model model){
User user=userService.Login2(email,password);
if(user==null){
request.setAttribute("error","用户名或密码不能为空");
return "Login";
}else{
model.addAttribute("user",user);
return "index";
}
}
}
? ? 第十步:开始启动tomcat,如果控制台无报错信息,说明配置整合成功,反之失败,所以整合过程中一定要仔细 十月 28,2017 12:06:40 上午 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Demo_Model' did not find a matching property. 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server version: Apache Tomcat/7.0.82 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server built: Sep 29 2017 12:23:15 UTC 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Server number: 7.0.82.0 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS Name: Windows 8 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: OS Version: 6.2 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Architecture: amd64 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Java Home: D:jdk1.7.0_51jre 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM Version: 1.7.0_51-b13 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: JVM Vendor: Oracle Corporation 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_BASE: D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: CATALINA_HOME: D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dcatalina.base=D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dcatalina.home=D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dwtp.deploy=D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82wtpwebapps 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Djava.endorsed.dirs=D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82endorsed 十月 28,1)"> 上午 org.apache.catalina.startup.VersionLoggerListener log 信息: Command line argument: -Dfile.encoding=GBK 十月 28,1)"> 上午 org.apache.catalina.core.AprLifecycleListener lifecycleEvent 信息: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: D:jdk1.7.0_51bin;C:WINDOWSSunJavabin;C:WINDOWSsystem32;C:WINDOWS;D:/jdk1.7.0_51/bin/../jre/bin/server;D:/jdk1.7.0_51/bin/../jre/bin;D:/jdk1.7.0_51/bin/../jre/lib/amd64;D:jdk1.7.0_51bin;D:Mavenapache-maven-3.3.9bin;C:Program FilesGitcmd;C:Program Files (x86)ATI TechnologiesATI.ACECore-Static;D:Program FilesMySQLMySQL Server 5.7bin;C:Program FilesVisualSVN Serverbin;C:Program FilesTortoiseSVNbin;D:Program Filesmongodb-win32-x86_64-2.4.3bin;C:UserstracholarAppDataRoamingcabalbin;C:UserstracholarAppDataRoamingnpm;D:Program Filesuserbin;D:wamp64binphpphp5.6.16;D:texlive2015binwin32;D:Program Fileseclipse;;. 十月 28,1)"> 上午 org.apache.coyote.AbstractProtocol init 信息: Initializing ProtocolHandler ["http-bio-8080"] 十月 28,1)"> 上午 org.apache.coyote.AbstractProtocol init 信息: Initializing ProtocolHandler ["ajp-bio-8009" 上午 org.apache.catalina.startup.Catalina load 信息: Initialization processed in 1592 ms 十月 28,1)"> 上午 org.apache.catalina.core.StandardService startInternal 信息: Starting service Catalina 十月 28,2017 12:06:41 上午 org.apache.catalina.core.StandardEngine startInternal 信息: Starting Servlet Engine: Apache Tomcat/7.0.82 上午 org.apache.catalina.startup.TldConfig execute 信息: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 十月 28,1)"> 上午 org.apache.catalina.core.ApplicationContext log 信息: No Spring WebApplicationInitializer types detected on classpath 十月 28,1)"> 上午 org.apache.catalina.core.ApplicationContext log 信息: Initializing Spring root WebApplicationContext 十月 28,1)"> 上午 org.springframework.web.context.ContextLoader initWebApplicationContext 信息: Root WebApplicationContext: initialization started 十月 28,1)"> 上午 org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh 信息: Refreshing Root WebApplicationContext: startup date [Sat Oct 28 00:06:46 CST 2017]; root of context hierarchy 十月 28,1)"> 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 信息: Loading XML bean definitions from path resource [applicationContext.xml] 十月 28,2017 12:06:49 上午 org.springframework.web.context.ContextLoader initWebApplicationContext 信息: Root WebApplicationContext: initialization completed in 2875 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deploying web application directory D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82webappsdocs 十月 28,1)"> 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82webappsdocs has finished in 234webappsexamples 十月 28,2017 12:06:51 上午 org.apache.catalina.core.ApplicationContext log 信息: ContextListener: contextInitialized() 十月 28,1)"> 上午 org.apache.catalina.core.ApplicationContext log 信息: SessionListener: contextInitialized() 十月 28,1)"> 上午 org.apache.catalina.core.ApplicationContext log 信息: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache','org.apache.jasper.compiler.TldLocationsCache@a8e6df5') 十月 28,1)"> 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82webappsexamples has finished in 1,568 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deploying web application directory D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82webappshost-manager 十月 28,1)"> 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82webappshost-manager has finished in 421webappsmanager 十月 28,1)"> 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82webappsmanager has finished in 141webappsROOT 十月 28,1)"> 上午 org.apache.catalina.startup.HostConfig deployDirectory 信息: Deployment of web application directory D:Program Filesapache-tomcat-7.0.82-windows-x64apache-tomcat-7.0.82webappsROOT has finished in 94 上午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["http-bio-8080" 上午 org.apache.coyote.AbstractProtocol start 信息: Starting ProtocolHandler ["ajp-bio-8009" 上午 org.apache.catalina.startup.Catalina start 信息: Server startup in 11060 ms ? ?接下来开始写登录页面做异步验证,在此之前AJax所需的jQuery插件一定要记得导,导入后,写个alert弹框测试一下,以保证在Ajax和JQuery交互的过程中不会因为插件的问题而报错 <%@ page language="java contentTypetext/html; charset=UTF-8 pageEncodingUTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"htmlheadmeta http-equiv="Content-Type" content="text/html; charset=UTF-8"title>登录script type="text/javascript" src="js/jquery-1.12.4.min.js"script> function m1() { $(document).ready(() { var email $(#email).val(); if (email == null ||"") { $(#nameDiv1).html(邮箱不能为空); } else (email.indexOf(@) -1邮箱格式不正确,必须包含@.); } else { $.post(${pageContext.request.contextPath}/emailCheck.do,{ email : email },(data) { $().html(data); },1)">text); } }); } m2(){ $(document).ready((){ email$().val(); password#password(password==nullpassword){ $(#nameDiv2密码不能为空); }(password.length<6密码长度不能小于六位>18密码长度已经超过18位,不符合给定要求{ $.post( ${pageContext.request.contextPath}/passCheck.do:email,1)">:password},1)">(data){ $( ); } }); } > bodydiv align="center"> form action="LoginCheck.do" method="post"> h2 >${error}h2> table > tr> td>Email:input ="text" name="email" onblur="m1()" style="width: 200px;" /></><span ="nameDiv1" style="color: red; font-size: 15px;"span>Password:="m2()"="nameDiv2"="submit"="Login" > tableform> div> <%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${user.userName}
</body>
</html>
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |