目录
一、创建项目
在创建项目时要注意,在idea中一个Project对应 eclipse中一个工作区间 working space,而Module 才是一个工程,不然新建Project又要重新切换部署了,所以这里我们新建 Module
在eclipse中我们都是创建一个Dynamic Web Project,对应在idea中创建一个 Java EE Web Application
注意不要勾选下图中 Spring MVC 选项,此选项是使用Maven部署了。
创建成功后目录:
二、创建配置文件
1、创建配置文件 :
在WEB-INF目录下面新建 lib目录,将Jar复制过来。这里使用的Spring4.0,还有其他一些 http ,fastjson,commons, apach的一些jar; 在src目录下创建applicationContext.xml,context-dispatcher.xml,
2、创建项目文件:
创建java package,com.spm.action,com.spm.domain, com.spm.service, com.spm.util,分别创建Java后台 UserController, User, UserService ,util等java类,最后创建一些前端页面文件index.jsp, login.jsp, main.jsp, main/login.js, main/main.js, 还有jquery包,放在main/目录下。(META-INF不需要创建,一会配置的时候会自动生成)项目整体结构如下图:
三、配置idea的Project Structure
配置Project Structure,这个是idea的配置,在这里指定编译jdk、引入要依赖的Jar,Tomcat 等。Module位置相当于eclipse中编译后 .class文件位置。
选中项目点击右上角 Project Structure 按钮:如图
1.第一步: 配置Project
配置此工作空间(idea的Project ,spm项目相当于一个Module)的编译环境,选择jdk1.8
2.第二步:配置Modules
在Modules中有三个选卡Sources、Paths、Dependencies。Sources不需要修改。先配置Paths,Paths中设置的是module编译后文件路径,最好放在当前项目目录下,如下图。
然后配置Dependencies,Dependencies里面你会发现 是依赖jar目录,首先jdk已经有了 ,不需要你配置,点击左下角的+,依次添加JARs or directiors (添加 lib里面的jar ),Library (Tomcat)。如下图:
3.第三步:配置 Facets
这一步是配置生成 META-INF/context.xml ,在context.xml中配置数据库连接 Source, 如下图:
4、第四步: 配置 Artifacts,
这一步主要是设置 Output directory:如下图:
最后点击OK保存即可。如果 Artifacts不存在可以点击 + ,根据Module 去生成,这里可以新增Web Application: Exploded, 会生成一个spm_war_exploded文件夹相当于项目编译后的文件夹(war包在tomcat webapps中被解压后的项目文件) ,也可以新增Web Application:Archive ,这是生成war包。
四、配置文件
1、web.xml 配置
主要是一些常规配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="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>spm</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:context-dispatcher.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.map</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.eot</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.svg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.ttf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.woff</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.woff2</url-pattern>
</servlet-mapping>
<!--提供移动端接口获取文件Zip下载,下载后删除 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.zip</url-pattern>
</servlet-mapping>
<!-- session time in 1440 mins 2019/06-->
<session-config>
<session-timeout>1440</session-timeout>
</session-config>
</web-app>
2、applicationContext.xml配置
applicationContext.xml配置包括spring的约束,java包的扫描,数据库jndi的配置,如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation=" http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-4.0.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
">
<context:component-scan base-package="com.spm" />
<mvc:annotation-driven />
<context:annotation-config />
<context:component-scan base-package="com.spm.util"/>
<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
<!-- Database -->
<jee:jndi-lookup id="dataSource"
jndi-name="jdbc/AppService"
cache="true"
resource-ref="true"
lookup-on-startup="false"
proxy-interface="javax.sql.DataSource"/>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- a PlatformTransactionManager is still required -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
<property name="maxUploadSize" value="38000000" /><!-- 上传最大文件限制 -->
<property name="maxInMemorySize" value="4096" /><!-- 读取文件到内存中的最大字节数,默认1024字节 -->
<property name="defaultEncoding" value="utf-8" />
</bean>
</beans>
3、context-dispatcher.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true"
xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
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.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd"
default-autowire="byName">
<!-- 使用注解的包,包括子集 -->
<context:component-scan base-package="com.spm.action">
<context:include-filter type="annotation"
expression="org.springframework.web.bind.annotation.ControllerAdvice" />
</context:component-scan>
<!-- 通过注解,把URL映射到Controller上,该标签默认注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<!-- <mvc:annotation-driven/> -->
<!-- json配置,需要导入fastjson包 采用的spring4.0版本 -->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean id="fastJsonHttpMessageConverter"
class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4、然后是 context.xml
这里context.xml配置是配置数据库的地址、账号、密码等。如果项目在tomcat中运行 也可以直接在Tomcat的 ..conf/context.xml中配置 一个Resource ,这里我们已经在Facets里面添加了,这里就在项目中配置即可。注意<Resource..../> 里面name 要和 applicationContext.xml 中 <jeez: jndi-loopup...>中的jndi名字一致。
5、Java类,jsp、js
UserController.java
package com.spm.action;
import com.spm.domain.BaseResp;
import com.spm.domain.User;
import com.spm.service.UserService;
import com.spm.util.Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@Autowired(required = true)
private HttpServletRequest request;
@RequestMapping("/login")
@ResponseBody
public BaseResp login(String userId, String pwd, @ModelAttribute("clientIpAddress") String clientIpAddress)
{
try {
System.out.println("userId : "+userId +"pwd : " + pwd);
// 校验用户名,密码,检验码,设置最后登陆时间和IP地址
HttpSession session = request.getSession();
User user = this.userService.checkLogin(userId, pwd);
System.out.println(user);
if (Utils.isBlank(user)) {
// 记录日志
return BaseResp.getFailInstance("Account or Password error, please check your account.");
}
// 获取岗位等其他信息
session.setAttribute("user", user);
// session.setAttribute("emp", emp);
// session.setAttribute("orgName", orgName);
// session.setAttribute("rndNum", userId + sDate);
session.setAttribute("clientIpAddress", clientIpAddress);
// 记录日志
return BaseResp.getSuccessInstance(user);
} catch (Exception e) {
e.printStackTrace();
return BaseResp.getFailInstance();
}
}
}
BaseResp.java
package com.spm.domain;
public class BaseResp {
public final static Integer HTTP_OK = 200;
public final static String MESSAGE_OK = "SUCCESS";
public final static Integer HTTP_ERROR_500 = 500;
public final static String MESSAGE_ERROR = "The system error, please wait.";
public final static Integer HTTP_ERROR_501 = 501;
private Integer retCode;
private String message;
private Object data;
public BaseResp() { }
public BaseResp(int retCode, String message, Object data) {
this.retCode = retCode;
this.message = message;
this.data = data;
}
public static BaseResp getSuccessInstance() {
return new BaseResp(HTTP_OK, MESSAGE_OK, null);
}
public static BaseResp getSuccessInstance(Object data) {
return new BaseResp(HTTP_OK, MESSAGE_OK, data);
}
// 系统异常
public static BaseResp getFailInstance() {
return new BaseResp(HTTP_ERROR_500, MESSAGE_ERROR, null);
}
// 业务异常
public static BaseResp getFailInstance(String errorMsg) {
return new BaseResp(HTTP_ERROR_501, errorMsg, null);
}
public Integer getRetCode() {
return retCode;
}
public void setRetCode(Integer retCode) {
this.retCode = retCode;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
User.java
package com.spm.domain;
public class User {
private String userId;
private String password;
private String status;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", password='" + password + '\'' +
", status='" + status + '\'' +
'}';
}
}
UserService.java
package com.spm.service;
import com.spm.domain.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public User checkLogin(String userId, String pwd) {
try {
String sql = "select * from T_USER where userId=? and password=?";
System.out.println("sql="+sql);
final Object[] params = new Object[]{userId, pwd};
return this.jdbcTemplate.queryForObject(sql, params, new BeanPropertyRowMapper<User>(User.class));
} catch (EmptyResultDataAccessException e) {
return null;
}
}
}
index.jsp
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<!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=GB18030">
<title>Insert title here</title>
</head>
<body>
<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
response.setHeader("Location",request.getContextPath()+"/login.jsp");
%>
</body>
</html>
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
</head>
<body>
<div style="margin-left: 40%;"><span> spm console</span></div>
</br>
</br>
<div >
<div id="loginform" >
<form >
<div >
<div style="margin-left: 40%;">
<input id="username" name="" type="text" placeholder="账户" >
</div>
</div>
<div >
<div style="margin-left: 40%;">
<input id="password" name="" type="password" placeholder="密码" >
</div>
</div>
<div>
<div style="margin-left: 40%">
<button style="margin-left: 10px;" οnclick="submitForm()"> 登 录 </button>
<button type="reset"> 取 消 </button>
</div>
</div>
</form>
</div>
</div>
<script src="main/jquery/jquery.js"></script>
<script src="main/login.js"></script>
</body>
</html>
main.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*,com.spm.domain.*"%>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
</head>
<body>
<div class="header"><span class="login-title">spm main console</span></div>
</body>
</html>
login.js
function submitForm(){
var username = $("#username").val();
var pwd = $("#password").val();
if(!username || username=="" || !pwd || ""==pwd){
swal("", "用户名/密码不能为空!", "error");
return;
}
var newEmpData ={
userId: username,
pwd: pwd
};
$.ajax({
type : "POST",
url : "user/login.json",
data : newEmpData,
success : function(data) {
var ret = data;
if(data.retCode&&data.retCode ==200 ){
window.location.href = 'main.jsp';
}else{
alert(data.message);
}
},
error : function() {
alert("服务器异常,请稍后再试!");
}
})
}
6、数据库
创建myfb数据库,创建了 t_user表
CREATE TABLE `t_user` (
`userId` varchar(50) NOT NULL,
`userName` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`lastLoginIp` varchar(255) DEFAULT NULL,
`lastLoginTime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`status` varchar(255) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
五、配置Tomcat
六、启动服务,验证
最后:启动tomcat在浏览器输入 :http://localhost:8080/spm/
点击登陆,后调用 login接口:查询数据库,日志如下图
然后返回查询结果,成功后跳转到main.jsp 页面。
也可以通过postman验证接口: