如果您对由于路径差异java,springmvc,velocity而找不到JS/CSS文件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于由于路径差异java,springm
如果您对由于路径差异java,spring mvc,velocity而找不到JS / CSS文件感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于由于路径差异java,spring mvc,velocity而找不到JS / CSS文件的详细内容,我们还将为您解答因为该路径太复杂的相关问题,并且为您提供关于JAVA - ssm(SpringMVC,Spring,Mybatis)整合、java – Spring启动MVC:找不到JSP、mybatis springmvc velocity 环境搭建、org.springframework.ui.velocity.VelocityEngineUtils的实例源码的有价值信息。
本文目录一览:- 由于路径差异java,spring mvc,velocity而找不到JS / CSS文件(因为该路径太复杂)
- JAVA - ssm(SpringMVC,Spring,Mybatis)整合
- java – Spring启动MVC:找不到JSP
- mybatis springmvc velocity 环境搭建
- org.springframework.ui.velocity.VelocityEngineUtils的实例源码
由于路径差异java,spring mvc,velocity而找不到JS / CSS文件(因为该路径太复杂)
我有这个目录结构:
webapp
- resources
- custom.js
- base.css
- WEB-INF
- views
- layout.vm
- top.vm
- footer.vm
- index.vm
- FolderA
- restricted.vm
我的layout.vm是:
#parse('top.vm')
$screen_content
#parse('footer.vm')
我的top.vm包含以下JS和CSS文件:
<link href="resources/base.css" rel="stylesheet">
<script src="resources/custom.js"></script>
现在,当我访问http://www.example.com:8080/index页面时,我看到找到了JS和CSS文件。但是,当我访问http://www.example.com:8080/FolderA/restricted时,找不到JS和CSS文件。当我在顶部更改它时它起作用
但是随后索引页被破坏了。
我正在使用弹簧控制器返回适当的视图。例如,以下返回索引页:
@RequestMapping(value = "/",method = RequestMethod.GET)
public String home(Model model) {
return "index";
}
这将返回受限视图:
@Controller
@RequestMapping(value = "/FolderA")
public class SomeController {
@RequestMapping(value = "",method = RequestMethod.GET)
public String secured(Model model) {
return "FolderA/restricted";
}
关于如何解决此问题的任何建议?
附带说明,在使用常规jsp文件时,我也遇到了这个问题,但是我设法使用来解决了这个问题<c:url ..>
。我不知道如何解决速度问题。
JAVA - ssm(SpringMVC,Spring,Mybatis)整合
web 后端开发分为 3 层
表现层 SpringMVC 和浏览器交互
业务层 Spring 框架 业务逻辑
持久层 MyBatis 和数据库交互
整合可以用配置文件 + 注解的方式。
以 Spring 为主整合 SpringMVC 和 MyBatis
开发环境:
系统:windows7 64 位
java:IDEA
数据库:mysql
数据库管理器:SQLyog
先配一下环境变量。。。之前的笔记里有写。
tomcat 的下载安装配置
https://www.cnblogs.com/clamp7724/p/11484331.html
mysql 的下载安装配置
https://www.cnblogs.com/clamp7724/p/11510625.html
1. 创建数据库
下载安装打开 SQLyog,新建数据库连接
然后输入信息,一般用默认的就好了,输入密码
点击测试连接,弹出 success 说明连接成功
点击连接,成功登陆。
输入 sql 语句创建数据库 ssm,在里面创建新表 account
CREATE DATABASE ssm;
USE ssm;
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(20),
money DOUBLE
);
创建后左边刷新看见新库,table 里面是创建的表。
2. IDEA 新建 spring 架构的工程
File - new - Project
Maven - 勾选 Create from archetype - 选择 maven 的 webapp (有很多 webapp- - 别选错了),上面是选择 JDK 版本,貌似现在开发都用 8(1.8),我这个是最新的 10(也就是 1.10)
填写组信息,如果建的时候选中了其他的工程,上面会有 parent 和 add as modeule to 的选项,改成 none,不然就变成了其他工程的下属 module 了。
然后一直 next,到最后,这里找个位置,然后起个项目名字,点 finish。
项目创建完成。
3. 配置文件:pom.xml
修改 properties
<properties> <!-- 这里相当于定义了一些变量,将来修改版本的时候只改这里就可以了。 -->
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<shiro.version>1.2.3</shiro.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
修改 dependencies
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
4. 添加必要文件夹
main 下面创建 2 个新文件夹,java 和 resources
把 java 设为 Sources Root,用来存放 java 类
把 resources 设为 resources Root, 用来存放 js,图片这类的资源。
java 下面创建 4 个 package
controller:用来处理和前台的交互
dao:持久层或者数据访问层,用来和数据库交互
domain:从来存放 javabean(刚接触的人可能不知道是啥 - - 其实就是储存信息的基本类,只有属性,get,set 方法,单纯用来储存数据,这种 class 类叫做 javabean。我是理解为 MVC 中 M 层的 entity。。。)
service:用来处理业务逻辑
整个项目的大体结构:web 前端 - controller - service - domain - dao - database 数据库
这样环境就搭建完毕了。
然后尝试完成目标:对用户账户的操作(添加和查询)
1. 在 domain 中创建 Account 类,用来映射刚才数据库新建的 Account 表中的数据。
添加 3 个属性对应 3 个表属性
package domain;
//CREATE DATABASE ssm;
//USE ssm;
//CREATE TABLE account(
//id INT PRIMARY KEY AUTO_INCREMENT,
//NAME VARCHAR(20),
//money DOUBLE
//);
public class Account {
private Integer id;
private String name;
private double money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
}
并生成对应 get 和 set 方法。
2. 在 dao 中创建接口 AccountDao,类型是 interface。
在里面添加两个抽象方法,因为 AccountDao 是接口,所以先不用实现。
package dao;
import domain.Account;
import java.util.List;
public interface AccountDao {
//返回所有账户信息
public List<Account> findAll();
//保存所有账户信息
public void saveAccount(Account account);
}
3. 在 service 下面创建接口 AccountService
package service;
import domain.Account;
import java.util.List;
public interface AccountService {
//返回所有账户信息
public List<Account> findAll();
//保存所有账户信息
public void saveAccount(Account account);
}
在 service 下面创建新文件夹 serviceImpl(implement 实现),用来实现接口
serviceImpl 中添加 class 类,AccountServiceImpl,先简单实现两个方法。
package com.itheima.service.serviceImpl;
import com.itheima.domain.Account;
import com.itheima.service.AccountService;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("accountService") //表名是实现了哪个类,让spring可以扫描到这个类
public class AccountServiceImpl implements AccountService {
public List<Account> findAll() {
System.out.println("业务层查询所有账户");
return null;
}
public void saveAccount(Account account) {
System.out.println("业务层查询储存账户");
}
}
在 controller 下面添加 class AccountContoller。
这个类主要负责前后台交互,后面再具体实现。
这样就完成了 account 这个对象信息传递的 web 前端 - controller - service - domain - dao - database 数据库 的基本结构。
然后先完成 springMVC 部分:
1. 添加 psringMVC 配置文件
在 resources 中添加 spring 的配置文件,如果没有这个选项说明之前 pom.xml 配置错了。springframework 没导入
然后起个名字 springConfig,这个名字不影响,有意义就行,完成后是这个样子。
java 下面建一个 package,起个名字叫 com.itheima (名字随意。。。),
然后把目前 java 下面的 4 个 package 放进去。
然后修改 springConfig.xml
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring创建容器时要扫描的包,扫描注解, base-package的值是需要扫描的包名 -->
<context:component-scan base-package="com.itheima">
<!--制定扫包规则,不扫描@Controller注解的JAVA类,其他的还是要扫描 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan> </beans>
注意包名和刚才创建的 package 名字一致。
这里把 controller 排除在外,因为这个是 spring 的配置文件,controller 是归 springMVC 管。
启动后 spring 会把 class 都实例化。
可以测试一下 spring 可不可以用了。
在 resources 下面添加新配置文件,起名 log4j,用来记录日志。(dependency 中已经配置过了,不加的话会报错,不过不影响项目运行。因为只是输出日志用的。)
在里面加入配置
# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=info, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=d:\axis.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
java 下面的 com.itheima package 下面建一个 test package,创建类 SpringTest 用来测试
这里测试的方法是利用了 spring 启动后会扫描 java 包,然后为 class 创建 bean 对象(名字默认为 class 名字,首字母变小写)。这是实现 AOP(面向切面编程,spring 的主要思想之一)的必要步骤,所以可以利用这个来测试 spring 是否成功创建了对象,从而发现 spring 是否在工作了。
package com.itheima.test;
import com.itheima.service.AccountService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
@Test
public void test1() {
ApplicationContext ac = new ClassPathXmlApplicationContext("springConfig.xml");//手动加载配置文件
AccountService as = (AccountService)ac.getBean("accountService");
as.findAll(); //测试spring能否运行
}
}
这里 Test 是 junit 里面的注解(dependency 里面也配置了),专门用于局部测试,添加上后就可以直接右键方法直接运行方法进行测试了。
输出成功。
说明 spring 部分没问题了。
然后开始 springMVC
1. 配置 xml
在 resources 下面创建 Spring Config 名字叫:springMVC.xml,用来配置 springMVC
springMVC.xml 代码:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置创建spring容器要扫描的包 -->
<context:component-scan base-package="com.itheima">
<!-- 制定扫包规则 ,只扫描使用@Controller注解的JAVA类 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean> <mvc:annotation-driven></mvc:annotation-driven>
</beans>
修改 web.xml
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"
version="2.5">
<display-name>ssm_web</display-name>
<!-- 配置spring mvc的核心控制器 -->
<servlet>
<servlet-name>springmvcDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,用于读取springmvc的配置文件,注意名字和springMVC配置文件名字一致 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!-- 配置servlet的对象的创建时间点:应用加载时创建。取值只能是非0正整数,表示启动顺序 -->
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>springmvcDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置springMVC编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>
<!-- 启动过滤器 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param> </filter>
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
2. 修改 AccountController
这里用了 String 传值 和 ModelAndView 传值 两种方法
package com.itheima.controller;
import com.itheima.domain.Account;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("account")
public class AccountController {
@RequestMapping("findAll")
public ModelAndView findAll(){
ModelAndView mav = new ModelAndView();
mav.setViewName("findAllAccount");
Account[] accountList = new Account[2];
Account a1 = new Account();
a1.setId(1);
a1.setMoney(10.0);
a1.setName("account1");
Account a2 = new Account();
a2.setId(2);
a2.setMoney(20.0);
a2.setName("account2");
accountList[0] = a1;
accountList[1] = a2;
mav.addObject("accountList", accountList);
return mav;
}
@RequestMapping("saveAccount")
public String saveAccount(Model model, Account account){
model.addAttribute("accountName", account.getName());
return "saveAccount";
}
}
3. 添加对应 jsp 页面
在 webapp - WEB-INF 下添加 pages 文件夹,在里面新建两个 jsp 文件,对应两个方法的返回页面名字。
修改 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<body>
<h2>Hello ssm</h2>
<form action="/account/saveAccount" method="post">
账户信息:<br/>
账户编号:<input type="text" name = ''id''><br/><!--name要和account的属性一致-->
账户名:<input type="text" name = ''name''><br/>
金额:<input type="text" name = ''money''><br/>
<input type ="submit" value = "保存">
</form>
<a href = "/account/findAll">显示所有账户信息</a>
</body>
</html>
修改 saveAccount.jsp
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 10/30/2019
Time: 7:46 AM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>success</title>
</head>
<body>
<div>${accountName} 已保存</div>
</body>
</html>
修改 findAllAccount.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
Created by IntelliJ IDEA.
User: Administrator
Date: 10/30/2019
Time: 7:45 AM
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<table>
<tr>
<th>编号</th>
<th>账户名称</th>
<th>账户金额</th>
</tr>
<c:forEach items="${accountList}" var="account">
<tr> <td>${account.id}</td>
<td>${account.name }</td>
<td>${account.money }</td>
</tr>
</c:forEach>
</table>
</body>
</html>
启动 tomcat 测试一下
点击保存
返回了 index 填写的名字,传值成功
返回 index 页面,点击显示所有账户信息
伪造的数据可以显示。
springMVC 可以独立运行。
然后开始整合 spring 和 springMVC
修改 web.xml
添加监听器,在 tomcat 启动时加载 spring 的配置
添加的代码:
<!-- 配置spring提供的监听器,用于启动服务时加载容器 。 该间监听器只能加载WEB-INF目录中名称为applicationContext.xml的配置文件 -->
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<!-- 因为我们名字和位置都和默认值不同,所以要手动指定spring配置文件位置,注意param-value的值,要和创建的名字一致 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springConfig.xml</param-value>
</context-param>
修改 controller,把手动伪造的数据变为调用 service 方法
package com.itheima.controller;
import com.itheima.domain.Account;
import com.itheima.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Controller
@RequestMapping("account")
public class AccountController {
@Autowired //自动注入,取到spring创建的代理对象,对业务层进行操作。
private AccountService accountService;
@RequestMapping("findAll")
public ModelAndView findAll(){
ModelAndView mav = new ModelAndView();
mav.setViewName("findAllAccount");
List<Account> accountList = accountService.findAll();
mav.addObject("accountList", accountList);
return mav;
}
@RequestMapping("saveAccount")
public String saveAccount(Model model, Account account){
model.addAttribute("accountName", account.getName());
accountService.saveAccount(account);
return "saveAccount";
}
}
再运行 tomcat,点击 index 的按钮
调用到了 sevice 层的方法,整合成功
开始写 Mybatis 部分
1. 配置文件
resources 下面创建新配置文件
名字叫 SqlMapConfig.xml 这里因为是 file 所以要手动写后缀名
配置文件代码:
<?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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/> <!--mysql的账户密码,根据自己的mysql实际情况修改-->
<property name="password" value="Zy1990526"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--<mapper/>--><!--扫描这个class-->
<package name="com.itheima.dao"/> <!--扫描包下面所有dao,这样以后添加新的dao救不用修改了-->
</mappers>
</configuration>
修改 AccountDao,通过注解实现操作数据库
package com.itheima.dao;
import com.itheima.domain.Account;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface AccountDao {
//返回所有账户信息
@Select("select * from account") //利用ibatis的注解用sql语句操作数据库
public List<Account> findAll();
//保存所有账户信息
@Insert("insert into account(name,money) values(#{name}, #{money}) ") //id是自增长的所以只需要name和money的值。
public void saveAccount(Account account);
}
创建测试:
在 test 下面创建 MyBatisTest
package com.itheima.test;
import com.itheima.dao.AccountDao;
import com.itheima.domain.Account;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;
public class MybatisTest {
@Test
public void findAllTest() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session= factory.openSession();
AccountDao dao = session.getMapper(AccountDao.class);//取得MyBatis生成的代理对象
List<Account> accountList = dao.findAll();//调用对象方法,往数据库里插入一条数据。
for(int i=0; i<accountList.size(); i++){
System.out.println(accountList.get(i).toString());
}
session.close();
in.close();
}
@Test
public void saveAccountTest() throws Exception {
Account account = new Account();
account.setId(1);
account.setName("account1");
account.setMoney(5000f);
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession session= factory.openSession();
AccountDao dao = session.getMapper(AccountDao.class);//取得MyBatis生成的代理对象
dao.saveAccount(account);//调用对象方法,往数据库里插入一条数据。
session.commit(); //提交修改,否则数据库会回滚。.
session.close();
in.close();
}
}
运行 saveAccountTest 方法后,查看 mysql 数据库的 account 表(aaa 和 bbb 是从数据库手动插入的,用来测试)
运行 findAllAccount 查询后(上面的警告是因为 JDK 版本过高,可能出现不兼容,1.9 以上貌似都会有这个警告)
MyBatis 独立运行成功。
开始整合 spring 和 mybatis
1. 配置文件
springConfig 的 beans 里面添加配置,把 MyBatis 的部分加进来
添加内容后:
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring创建容器时要扫描的包,扫描注解, base-package的值是需要扫描的包名 -->
<context:component-scan base-package="com.itheima">
<!--制定扫包规则,不扫描@Controller注解的JAVA类,其他的还是要扫描 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 配置C3P0的连接池对象 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/> <!--数据库名称-->
<property name="username" value="root" /> <!--用户名-->
<property name="password" value="Zy1990526" /> <!--密码-->
</bean>
<!-- 配置SqlSession的工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置扫描dao的包 -->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.dao"/> <!--修改为自己dao的路径-->
</bean>
</beans>
然后 SqlMapConfig.xml 就没用了,把里面内容清空。
2。修改 java 部分
修改 AccountDao
在上面添加注解 @Repository,把接口交给 spring 扫描
添加后:
package com.itheima.dao;
import com.itheima.domain.Account;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface AccountDao {
//返回所有账户信息
@Select("select * from account") //利用ibatis的注解用sql语句操作数据库
public List<Account> findAll();
//保存所有账户信息
@Insert("insert into account(name,money) value(#{name}, #{money}) ") //id是自增长的。
public void saveAccount(Account account);
}
修改 AccountServiceImpl,把里面的方法与 dao 的方法挂钩。
package com.itheima.service.serviceImpl;
import com.itheima.dao.AccountDao;
import com.itheima.domain.Account;
import com.itheima.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service("accountService") //表名是实现了哪个类,让spring可以扫描到这个类
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao; //注入dao
public List<Account> findAll() {
System.out.println("业务层查询所有账户");
return accountDao.findAll();
}
public void saveAccount(Account account) {
System.out.println("业务层查询储存账户");
accountDao.saveAccount(account);
}
}
这样整个框架就串起来了
前台点击提交后,调用 controller,然后 controller 中使用 service 中的方法调用 dao 的方法,dao 的方法连接数据库查询结果后返回结果,给 service,service 返回给 controller,controller 传给跳转页面显示。完成业务流程。
整合完成,开始测试
点击保存
页面跳转成功,然后返回,点击显示所有账户信息
成功。
ssm 框架整合完成。
然后才想起来 - -id 是自增长的,没必要在前台和 controller 里面赋值。。。
因为配置文件很容易出问题,而且还不好改,所以把最后完成的完整版的 4 个配置文件放在这 = =
springConfig.xml
变量部分:spring 部分的 java 所在位置。 数据库信息,整合到 spring 的 dao 部分的路径
com.itheima
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/> <!--数据库名称-->
<property name="username" value="root" /> <!--用户名-->
<property name="password" value="Zy1990526" /> <!--密码-->
com.itheima.dao
<?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:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring创建容器时要扫描的包,扫描注解, base-package的值是需要扫描的包名 -->
<context:component-scan base-package="com.itheima">
<!--制定扫包规则,不扫描@Controller注解的JAVA类,其他的还是要扫描 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 配置C3P0的连接池对象 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/> <!--数据库名称-->
<property name="username" value="root" /> <!--用户名-->
<property name="password" value="Zy1990526" /> <!--密码-->
</bean>
<!-- 配置SqlSession的工厂 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置扫描dao的包 -->
<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.itheima.dao"/> <!--修改为自己dao的路径-->
</bean>
</beans>
springMVC.xml
变量部分:springMVC 需要扫的 controller 所在 java 包位置,和前端 jsp 页面所在位置,如果不一样需要修改。
com.itheima
/WEB-INF/pages/
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置创建spring容器要扫描的包 -->
<context:component-scan base-package="com.itheima">
<!-- 制定扫包规则 ,只扫描使用@Controller注解的JAVA类 -->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven></mvc:annotation-driven>
</beans>
web.xml
变量部分: 整合其他两个 xml 用的路径,如果文件名不一样需要修改
classpath:springConfig.xml
classpath:springMVC.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"
version="2.5">
<display-name>ssm_web</display-name>
<!-- 配置spring提供的监听器,用于启动服务时加载容器 。 该间监听器只能加载WEB-INF目录中名称为applicationContext.xml的配置文件 -->
<listener>
<listener-class> org.springframework.web.context.ContextLoaderListener </listener-class>
</listener>
<!-- 因为我们名字和位置都和默认值不同,所以要手动指定spring配置文件位置,注意param-value的值,要和创建的名字一致 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springConfig.xml</param-value>
</context-param>
<!-- 配置spring mvc的核心控制器 -->
<servlet>
<servlet-name>springmvcDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,用于读取springmvc的配置文件,注意名字和springMVC配置文件名字一致 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC.xml</param-value>
</init-param>
<!-- 配置servlet的对象的创建时间点:应用加载时创建。取值只能是非0正整数,表示启动顺序 -->
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>springmvcDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 配置springMVC编码过滤器 -->
<filter>
<filter-name>CharacterEncodingFilter</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>
<!-- 启动过滤器 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
pom.xml 不用修改
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>SpringMVC_test</groupId>
<artifactId>ssm</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ssm Maven Webapp</name>
<url>http://www.example.com</url>
<properties> <!-- 这里相当于定义了一些变量,将来修改版本的时候只改这里就可以了。 -->
<spring.version>5.0.2.RELEASE</spring.version>
<slf4j.version>1.6.6</slf4j.version>
<log4j.version>1.2.12</log4j.version>
<shiro.version>1.2.3</shiro.version>
<mysql.version>5.1.6</mysql.version>
<mybatis.version>3.4.5</mybatis.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.6.8</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<finalName>ssm</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
注意里面的变量。。。根据实际情况修改。
java – Spring启动MVC:找不到JSP
我做了什么
这是我的JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!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> <ul> <%--@elvariable id="users" type="java.util.List"--%> <c:forEach items="${utenti}" var="utente"> <li> <c:out value="${utente.getUsername()}"/> </li> </c:forEach> </ul> </body> </html>
这是我的控制器:
@Controller public class UtenteController { @Autowired private UtenteService utenteService; @RequestMapping("/lista_utenti") public ModelAndView getListaUtentiView(){ ModelMap model = new ModelMap(); model.addAttribute("utenti",this.utenteService.getListaUtenti()); return new ModelAndView("lista_utenti",model); } }
这是我的application.properties:
# MVC spring.view.prefix=/WEB-INF/jsp/ spring.view.suffix=.jsp #Postgres config spring.datasource.driverClassName=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://localhost:5432/DB_Test spring.datasource.username=postgres spring.datasource.password=postgres
至少我的主要应用:
@Configuration @EnableAutoConfiguration @ComponentScan public class SpringWebApplication extends SpringBootServletinitializer{ public static void main(String[] args) { SpringApplication.run(SpringWebApplication.class,args); } @Override protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) { return application.sources(SpringWebApplication.class); } }
如果我去http:// localhost:8080 / lista_utenti,我会得到的是:
Whitelabel Error Page This application has no explicit mapping for /error,so you are seeing this as a fallback. Thu Jan 15 15:59:57 CET 2015 There was an unexpected error (type=Not Found,status=404). No message available
我究竟做错了什么?
解决方法
<dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> <scope>provided</scope> </dependency>
没有这个,我得到了同样的错误.
mybatis springmvc velocity 环境搭建
前言
轻量级 ORM 框架 MyBatis 完美的配合 SpringMVC web 框架实现了后台 action 的开发,结合 Java 模版引擎 velocity 实现了 Java 代码与前端代码的隔离。
搭建过程
后台配置 mybatis
添加依赖
Spring 3.2.4-RELEASE
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${version.spring}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${version.spring}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${version.spring}</version>
</dependency>
mybatis
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.3</version>
</dependency>
连接池 dbcp
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
配置
mybatis-config.xml, 此处只是示例
<?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>
<!--系统中持久层对象-->
<typeAlias type="com.buglife.webutil.model.Test" alias="Test"/>
</typeAliases>
<mappers>
<!--系统中持久层对象对应的Mapper映射XML文件-->
<mapper resource="com/buglife/webutil/mapper/TestMapper.xml" />
</mappers>
</configuration>
applicationContext.xml
<?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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
<!--加载JDBC配置文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<tx:annotation-driven/>
<context:component-scan base-package="com.buglife.webutil.web.service.impl"></context:component-scan>
<!--配置数据源(连接池)-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<bean id="sessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:config/mybatis-config.xml"/>
<property name="typeAliasesPackage" value="com.buglife.webutil.model"/>
</bean>
<!--配置事务-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--通过扫描Mapper所在包名自动注入Mapper-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.buglife.webutil.dao"/>
</bean>
</beans>
自动生成 Model 和 Mapper
创建 generatorConfig.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
<!--加载数据库连接驱动包-->
<classPathEntry
location="C:\Users\Administrator\.m2\repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar" />
<context id="context1" targetRuntime="MyBatis3">
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/webutil?useUnicode=true&characterEncoding=UTF-8"
userId="root" password="root" />
<!--Model存放位置-->
<javaModelGenerator targetPackage="com.buglife.webutil.model"
targetProject="src/main/java" />
<!--Mapper xml文件存放位置-->
<sqlMapGenerator targetPackage="com.buglife.webutil.mapper"
targetProject="src/main/resources" />
<!--Mapper 接口存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.buglife.webutil.dao" targetProject="src/main/java" />
<!--配置需要用到的数据表-->
<table schema="webutil" tableName="test" />
</context>
</generatorConfiguration>
添加 mybatis-generate 插件
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
<!--generatorConfig.xml存放位置-->
<configurationFile>src\main\resources\config\generatorConfig.xml</configurationFile>
</configuration>
<executions>
<!--自动生成Mapper和model的生命周期段-->
<execution>
<id>mapper-generate</id>
<phase>generate-resources</phase>
<goals>
<goal>generate</goal>
</goals>
</execution>
</executions>
</plugin>
这时执行 maven 的命令 mvn install 则可以生成 mybatis 所需的 model 和 Mapper
前端搭建 velocity
添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${version.spring}</version>
</dependency>
<!--支持velocity的依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${version.spring}</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-tools</artifactId>
<version>2.0</version>
</dependency>
在 SpringMVC 中配置 velocity
<!-- 配置velocity引擎 -->
<bean id="velocityConfigurer"
class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<!-- 模板存放的路径 -->
<property name="resourceLoaderPath" value="/WEB-INF/views/"/>
<!-- Velocity配置文件 -->
<property name="configLocation" value="classpath:velocity.properties"/>
</bean>
<!-- 配置视图的显示 -->
<bean id="ViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityLayoutViewResolver">
<property name="prefix" value="/"/>
<!-- 视图文件的前缀,即存放的路径 -->
<property name="suffix" value=".vm"/>
<!-- 视图文件的后缀名 -->
<!--<property name="toolboxConfigLocation" value="/WEB-INF/tools.xml"/>-->
<!--toolbox配置文件路径-->
<property name="dateToolAttribute" value="date"/>
<!--日期函数名称-->
<property name="numberToolAttribute" value="number"/>
<!--数字函数名称-->
<property name="contentType" value="text/html;charset=UTF-8"/>
<property name="exposeSpringMacroHelpers" value="true"/>
<!--是否使用spring对宏定义的支持-->
<property name="exposeRequestAttributes" value="true"/>
<!--是否开放request属性-->
<property name="requestContextAttribute" value="rc"/>
<!--request属性引用名称-->
<!--指定默认layout文件-->
<property name="layoutUrl" value="layout/default.vm"/>
</bean>
velocity 配置文件 velocity.properties, 主要配置输入输出编码格式
#指定宏定义位置
velocimacro.library = /WEB-INF/macros/macros.vm
input.encoding=UTF-8
output.encoding=UTF-8
最后看下 web.xml 中的配置情况
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.VelocityLayoutServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.tools.deprecationSupportMode</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>org.apache.velocity.tools.cleanConfiguration</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>org.apache.velocity.tools.userCanOverwriteTools</param-name>
<param-value>false</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
示例
可访问源码
org.springframework.ui.velocity.VelocityEngineUtils的实例源码
@Override public void sendEmail(final UserDTO user,String url) { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage); message.setTo(user.getEmail()); message.setSubject(SUBJECT); message.setFrom(EMAIL_FROM); // Could be parameterized... Map model = new HashMap(); model.put("user",user); model.put("url",url); String text = VeLocityEngineUtils.mergeTemplateIntoString( veLocityEngine,"org/enricogiurin/sushibar/registration-confirmation.vm",model); message.setText(text,true); } }; this.emailSender.send(preparator); }
@Override public void sendMailWithTemplate(final TemplateMailTO mailParameters) throws MailException { MimeMessagePreparator preparator = new MimeMessagePreparator() { @Override public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage); message.setTo(mailParameters.getToMailAddress()); message.setFrom(mailParameters.getFromMailAddress()); message.setSubject(mailParameters.getSubject()); if (mailParameters.hasCcMailAddress()) { message.setCc(mailParameters.getCcMailAddress()); } if (mailParameters.hasReplyTo()) { message.setReplyTo(mailParameters.getReplyTo()); } String text = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,mailParameters.getTemplateLocation(),mailParameters.getTemplateProperties()); log.debug("*** TEST text='" + text + "'"); message.setText(text,true); message.setValidateAddresses(true); } }; this.mailSender.send(preparator); }
@Test @SuppressWarnings("deprecation") public void veLocityConfigurerWithCsvPathAndNonFileAccess() throws IOException,VeLocityException { VeLocityConfigurer vc = new VeLocityConfigurer(); vc.setResourceLoaderPath("file:/mydir,file:/yourdir"); vc.setResourceLoader(new ResourceLoader() { @Override public Resource getResource(String location) { if ("file:/yourdir/test".equals(location)) { return new DescriptiveResource(""); } return new ByteArrayResource("test".getBytes(),"test"); } @Override public ClassLoader getClassLoader() { return getClass().getClassLoader(); } }); vc.setPreferFileSystemAccess(false); vc.afterPropertiesSet(); assertthat(vc.createVeLocityEngine(),instanceOf(VeLocityEngine.class)); VeLocityEngine ve = vc.createVeLocityEngine(); assertEquals("test",VeLocityEngineUtils.mergeTemplateIntoString(ve,"test",Collections.emptyMap())); }
@Override public void sendActivation(User user) throws InvalidTokenException { if (user.getActivationToken() == null) { throw new InvalidTokenException("No activation token found for " + user.toString()); } Map<String,Object> model = getBaseModel(user); model.put("url",hostname + "#/activation/" + user.getUsername() + "/" + user.getActivationToken().getToken()); final String body = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"templates/sendActivation.vm","UTF-8",model); MimeMessagePreparator preparator = mimeMessage -> { mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail())); mimeMessage.setFrom(new InternetAddress(mailFromAddress)); mimeMessage.setSubject("Kanbanboard WGM Accountaktivierung"); mimeMessage.setText(body,"html"); }; try { mailSender.send(preparator); log.info("Activation Mail sent to "+ user.getEmail()); } catch (MailException e) { log.error("Could not send activation mail to " + user.getEmail() + ". The error was :",e); } }
@Override public void sendPasswordReset(User user) throws InvalidTokenException { if (user.getpasswordResetToken() == null) { throw new InvalidTokenException("No password reset token found for " + user.toString()); } final Map<String,hostname + "#/reset/" + user.getUsername() + "/" + user.getpasswordResetToken().getToken()); final String body = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"templates/sendPasswordReset.vm",new InternetAddress(user.getEmail())); mimeMessage.setFrom(new InternetAddress(mailFromAddress)); mimeMessage.setSubject("Kanbanboard WGM Passwort Reset"); mimeMessage.setText(body,"html"); }; try { mailSender.send(preparator); log.info("Reset Mail sent to {}",user.getEmail()); } catch (MailException e) { log.error("Could not send mail to " + user.getEmail() + ". The error was :",e); } }
/** * Sends e-mail using VeLocity template for the body and the properties * passed in as VeLocity variables. * * @param msg The e-mail message to be sent,except for the body. * @param hTemplateVariables Variables to use when processing the template. */ protected void send(SimpleMailMessage msg,String language,String template,Map<String,Object> hTemplateVariables) { LOG.info("Send email ..."); MimeMessagePreparator preparator = (MimeMessage mimeMessage) -> { MimeMessageHelper message = new MimeMessageHelper(mimeMessage,"UTF-8"); message.setTo(msg.getTo()); message.setFrom(msg.getFrom()); message.setSubject(msg.getSubject()); String body = VeLocityEngineUtils.mergeTemplateIntoString( veLocityEngine,"/" + template + "." + language + ".vm",hTemplateVariables); LOG.log(Level.INFO,"Body: {0}",body); message.setText(body,true); }; mailSender.send(preparator); LOG.log(Level.INFO,"Sender {0}",msg.getFrom()); LOG.log(Level.INFO,"Recipient {0}",msg.getTo()); }
/** * Render the http auth properties file to be used with openfire * * @param request * the request to use * @return the rendered properties */ public static String getopenfireHttpAuthProperties(HttpServletRequest request) { // Todo change JSPs to VM and parse the http_auth.properties template VeLocityEngine engine = ServiceLocator.findService(VeLocityEngine.class); Map<String,Object> context = new HashMap<String,Object>(); context.put("defaultHost",ApplicationProperty.WEB_SERVER_HOST_NAME.getValue()); context.put("defaultPort",ApplicationProperty.WEB_HTTP_PORT.getValue()); context.put("internalHost",request.getServerName()); context.put("internalPort",request.getServerPort()); if (request.isSecure()) { context.put("internalProtocol","https"); } else { context.put("internalProtocol","http"); } context.put("defaultPortHttps",ApplicationProperty.WEB_HTTPS_PORT.getValue()); context.put("context",request.getcontextpath()); String render = VeLocityEngineUtils.mergeTemplateIntoString(engine,VELociTY_TEMPLATE_HTTP_AUTH_PROPERTIES,context); return render; }
@Override public String buildMessageBody(EmailInfo info,Object> props) { if (props == null) { props = new HashMap<String,Object>(); } if (props instanceof HashMap) { HashMap<String,Object> hashProps = (HashMap<String,Object>) props; @SuppressWarnings("unchecked") Map<String,Object> propscopy = (Map<String,Object>) hashProps.clone(); if (additionalConfigItems != null) { propscopy.putAll(additionalConfigItems); } return VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,info.getEmailTemplate(),info.getEncoding(),propscopy); } throw new IllegalArgumentException("Property map must be of type HashMap<String,Object>"); }
@Override public String buildMessageBody(EmailInfo info,Object>"); }
/** * Send a simple message based on a VeLocity template. * * @param msg * the message to populate * @param templateName * the VeLocity template to use (relative to classpath) * @param model * a map containing key/value pairs */ @SuppressWarnings("unchecked") public void sendMessage(SimpleMailMessage msg,String templateName,Map model) { String result = null; try { result = VeLocityEngineUtils.mergeTemplateIntoString( veLocityEngine,templateName,model); } catch (VeLocityException e) { log.error(e.getMessage()); } msg.setText(result); send(msg); }
/** * Send a simple message based on a VeLocity template. * @param msg the message to populate * @param templateName the VeLocity template to use (relative to classpath) * @param model a map containing key/value pairs */ public void sendMessage(SimpleMailMessage msg,Map model) { String result = null; try { result = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,model); } catch (VeLocityException e) { e.printstacktrace(); log.error(e.getMessage()); } msg.setText(result); send(msg); }
@Override public void send(final SimpleMailMessage msg,final Map<String,Object> hTemplateVariables,final String templateFileName) { MimeMessagePreparator preparator = new MimeMessagePreparator() { @Override public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage); message.setTo(msg.getTo()); message.setFrom(msg.getFrom()); message.setSubject(msg.getSubject()); String body = VeLocityEngineUtils.mergeTemplateIntoString( veLocityEngine,templateFileName,hTemplateVariables); //logger.info("body={}",body); message.setText(body,true); } }; mailSender.send(preparator); }
public void sendMail(Mail mail,Object> model) throws MessagingException { //Todo: Deepak. not the perfect way to pull resources from the below code //but accordng to http://veLocity.apache.org/engine/releases/veLocity-1.7/developer-guide.html#resourceloaders //File resource handelers needs more config for which we don't have enough time. MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,false,"utf-8"); helper.setSubject(mail.getSubject()); helper.setFrom(AppConstants.APP_EMAILID); for (MailReceiver mailReceiver : mail.getReceivers()) { model.put("_receiverFirstName",mailReceiver.firstName); model.put("_receiverLastName",mailReceiver.lastName); model.put("_receiverEmail",mailReceiver.email); model.put("_receiverImageUrl",mailReceiver.imageUrl); String mailBody = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"com/gendevs/bedrock/appengine/integration/mail/templates/" + mail.getTemplateName(),model); mimeMessage.setContent(mailBody,mail.getContentType()); helper.setTo(mailReceiver.email); mailSender.send(mimeMessage); } }
@Override public String buildMessageBody(EmailInfo info,Object>"); }
public void sendMailWithTemplate(final TemplateMailTO mailParameters) throws MailException { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage); message.setTo(mailParameters.getToMailAddress()); message.setFrom(mailParameters.getFromMailAddress()); message.setSubject(mailParameters.getSubject()); if (mailParameters.hasCcMailAddress()) { message.setCc(mailParameters.getCcMailAddress()); } if (mailParameters.hasReplyTo()) { message.setReplyTo(mailParameters.getReplyTo()); } String text = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,true); message.setValidateAddresses(true); } }; this.mailSender.send(preparator); }
@Override public void sendTplLocationEmail(final String from,final List<String> to,final List<String> cc,final String subject,final String tplLocation,Object> model) { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper message = new MimeMessageHelper(mimeMessage); message.setTo(to.toArray(new String[to.size()])); message.setCc(cc.toArray(new String[cc.size()])); message.setFrom(from); message.setSubject(subject); String tpl; tpl = VeLocityEngineUtils.mergeTemplateIntoString( veLocityEngine,tplLocation,"utf-8",model); message.setText(tpl,true); } }; JavaMailSenderImpl javaMailSenderImpl = (JavaMailSenderImpl) mailSender; javaMailSenderImpl.send(preparator); }
public String generateDataProvider() { Map<String,Object> model = new HashMap<>(); List<Config> configurations = openMRSConfigService.getConfigs().getConfigs(); if (configurations.isEmpty()) { // return null in case of no configurations - the provider won't get registered return null; } model.put("configurations",configurations); StringWriter writer = new StringWriter(); VeLocityEngineUtils.mergeTemplate(veLocityEngine,OPENMRS_TASK_DATA_PROVIDER,model,writer); String providerjson = writer.toString(); LOGGER.trace("Generated the following tasks data provider: {}",providerjson); return providerjson; }
public void testVeLocityEnginefactorybeanWithNonFileResourceLoaderPath() throws Exception { VeLocityEnginefactorybean vefb = new VeLocityEnginefactorybean(); vefb.setResourceLoaderPath("file:/mydir"); vefb.setResourceLoader(new ResourceLoader() { @Override public Resource getResource(String location) { if (location.equals("file:/mydir") || location.equals("file:/mydir/test")) { return new ByteArrayResource("test".getBytes(),"test"); } try { return new UrlResource(location); } catch (MalformedURLException ex) { throw new IllegalArgumentException(ex.toString()); } } @Override public ClassLoader getClassLoader() { return getClass().getClassLoader(); } }); vefb.afterPropertiesSet(); assertthat(vefb.getobject(),instanceOf(VeLocityEngine.class)); VeLocityEngine ve = vefb.getobject(); assertEquals("test",new HashMap())); }
public void testVeLocityConfigurerWithCsvPathAndNonFileAccess() throws IOException,new HashMap())); }
/** * Send a simple message based on a VeLocity template. * @param msg the message to populate * @param templateName the VeLocity template to use (relative to classpath) * @param model a map containing key/value pairs */ public void sendMessage(SimpleMailMessage msg,model); } catch (VeLocityException e) { e.printstacktrace(); log.error(e.getMessage()); } msg.setText(result); send(msg); }
public boolean sendConfirmMail(SBean bean,String action) { try { MimeMessage message = mailSender.createMimeMessage(); message.setSubject(getMessage("subscription.subject"),"UTF-8"); message.setRecipients(Message.RecipientType.TO,InternetAddress.parse(bean.getEmail().toLowerCase())); message.setFrom(new InternetAddress(getMessage("subscription.from"))); Map model = new HashMap(); model.put("subscribe_link",composeLink(bean,SubscriptionService.ACTION_SUBSCRIBE)); String text = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"/WEB-INF/templates/subscribe.vm",model); message.setContent(text,"text/html;charset=utf-8"); this.mailSender.send(message); return true; } catch (Exception e) { e.printstacktrace(); return false; } }
public boolean sendUpdatesMail(SBean bean,List<String>> data) { try { MimeMessage message = mailSender.createMimeMessage(); message.setSubject(getMessage("subscription.subject"),InternetAddress.parse(bean.getEmail())); message.setFrom(new InternetAddress(getMessage("subscription.from"))); Map model = new HashMap(); model.put("edit_link",SubscriptionService.ACTION_UNSUBSCRIBE)); model.put("data",data); String content = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"/WEB-INF/templates/updates.vm",model); message.setContent(content,"text/html;charset=utf-8"); this.mailSender.send(message); return true; } catch (Exception e) { return false; } }
private EmailServicetokenModel sendVerificationEmail(final EmailServicetokenModel emailVerificationModel,final String emailSubject,final String veLocityModel,String> resources) { MimeMessagePreparator preparator = new MimeMessagePreparator() { public void prepare(MimeMessage mimeMessage) throws Exception { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage,MimeMessageHelper.MULTIPART_MODE_RELATED,"UTF-8"); messageHelper.setTo(emailVerificationModel.getEmailAddress()); messageHelper.setFrom(emailFromAddress); messageHelper.setReplyTo(emailReplyToAddress); messageHelper.setSubject(emailSubject); Map model = new HashMap(); model.put("model",emailVerificationModel); String text = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,veLocityModel,model); messageHelper.setText(new String(text.getBytes(),"UTF-8"),true); for(String resourceIdentifier: resources.keySet()) { addInlineResource(messageHelper,resources.get(resourceIdentifier),resourceIdentifier); } } }; LOG.debug("Sending {} token to : {}",emailVerificationModel.getTokenType().toString(),emailVerificationModel.getEmailAddress()); this.mailSender.send(preparator); return emailVerificationModel; }
/** * Generates the mail message based on the file import status. * * @param importStatus The import status to generate file import mail message. * @return The file import mail message for the status. */ private String makeImportMailMessage(ImportStatus importStatus) { Map<String,Object> model = new HashMap<String,Object>(); model.put("importStatus",importStatus); model.put("datetool",new Datetool()); model.put("mathTool",new MathTool()); model.put("numberTool",new NumberTool()); model.put("StringUtils",StringUtils.class); try { return VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,fileImportMailTemplate,model); } catch (VeLocityException ve) { logger.error("Error while making file import mail message",ve); // Use the log text instead... return logImportStatus(importStatus); } }
/** * @see com.johndeere.myjd.service.email.CreateEmail#createEmail(com.johndeere.myjd.service.email.model.EmailParams) * @param emailParams * Email params required for creating the email * @return the Email content */ @Override public EmailParams createEmail(EmailParams emailParams) { if (LOG.isInfoEnabled()) { LOG.info("Enter create Email"); } // Get the template Variables to be used */ Map<String,Object> hTemplateVariables = emailParams .getParamsMapHolder(); String emailBody = VeLocityEngineUtils.mergeTemplateIntoString( veLocityEngine,emailParams.getEmailTemplate(),hTemplateVariables); if(LOG.isDebugEnabled()){ LOG.debug("Email body returned is : " + emailBody ); } emailParams.setEmailBody(emailBody); if(LOG.isDebugEnabled()){ LOG.debug("Exit Create Email " + emailParams); } return emailParams; }
private String geVeLocityTemplateContent(Map<String,Object> model,String templateName) throws VeLocityException { StringBuilder content = new StringBuilder(); try { content.append(VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,model)); return content.toString(); } catch (VeLocityException e) { log.debug("Exception occured while processing veLocity template: " + e.getMessage()); throw e; } }
/** * 发送邮箱验证码 * @param email 邮箱账号 * @param request * @return */ @ResponseBody @RequestMapping(value = "/sendEmail",method = RequestMethod.POST) public ResponseEntity sendEmail(String email,HttpServletRequest request){ if(email==null||!ValidateUtils.isEmail(email)){ return new ResponseEntity(400,"error","邮箱账号错误!"); } //发送注册邮件 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+ request.getcontextpath()+"/"; Map<String,Object> modelMap=new HashMap<String,Object>(); modelMap.put("USERNAME","baby慕慕"); modelMap.put("logoIMG",basePath+"resources/img/logo.png"); int verifyCode = RandomUtils.nextInt(100000,999999); request.getSession().setAttribute("VERIFYCODE",String.valueOf(verifyCode)); modelMap.put("VERIFYCODE",verifyCode); modelMap.put("IFORGOTURL",basePath+"system/iforget"); modelMap.put("LOGINURL",basePath+"system/login"); modelMap.put("OFFICIALURL",basePath); String content= VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"tpl/verifyCodeEmail.html",modelMap); try { boolean sendSuccess=emailService.send(email,null,"baby慕慕开放平台-验证码找回密码",content); if(sendSuccess){ return new ResponseEntity(200,"success","验证码发送成功"); } } catch (EmailException e) { e.printstacktrace(); } return new ResponseEntity(400,"邮箱发送失败!"); }
/** * 发送邮箱验证码 * * @param email 邮箱账号 * @param request * @return */ @ResponseBody @RequestMapping(value = "/send",HttpServletRequest request) { if (email == null || !ValidateUtils.isEmail(email)) { return new ResponseEntity(400,"邮箱账号错误!"); } //发送注册邮件 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getcontextpath() + "/"; Map<String,Object> modelMap = new HashMap<String,basePath + "resources/portal/img/logo.png"); int verifyCode = RandomUtils.nextInt(100000,basePath + "iforget"); modelMap.put("LOGINURL",basePath + "login"); modelMap.put("OFFICIALURL",basePath); String content = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,modelMap); try { boolean sendSuccess = emailService.send(email,content); if (sendSuccess) { return new ResponseEntity(200,"邮箱发送失败!"); }
private String getMessage(Notification notification,Map messageParameters) throws Exception { String messageVslFileName = L10nUtil.getNotificationMessageTemplate(Locales.NOTIFICATION,notification.getType().getMessageTemplateL10nKey()); if (messageVslFileName != null && messageVslFileName.length() > 0) { return VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,messageVslFileName,messageParameters); } else { return null; } }
@Override public void sendTestMail(JsonNode jsonConfig,String email) throws IoTPException { JavaMailSenderImpl testMailSender = createMailSender(jsonConfig); String mailFrom = jsonConfig.get("mailFrom").asText(); String subject = messages.getMessage("test.message.subject",Locale.US); Map<String,Object>(); model.put("targetEmail",email); String message = VeLocityEngineUtils.mergeTemplateIntoString(this.engine,"test.vm",model); sendMail(testMailSender,mailFrom,email,subject,message); }
@Test @SuppressWarnings("deprecation") public void veLocityEnginefactorybeanWithNonFileResourceLoaderPath() throws Exception { VeLocityEnginefactorybean vefb = new VeLocityEnginefactorybean(); vefb.setResourceLoaderPath("file:/mydir"); vefb.setResourceLoader(new ResourceLoader() { @Override public Resource getResource(String location) { if (location.equals("file:/mydir") || location.equals("file:/mydir/test")) { return new ByteArrayResource("test".getBytes(),Collections.emptyMap())); }
@Override public void sendTemplete(String address,String subject,Object> data) { data.put("domain",getDomain()); final String html = VeLocityEngineUtils.mergeTemplateIntoString(emailEngine.getEngine(),template,data); sendText(address,html,true); }
private void remindUser(User user,List<Task> tasks) { MimeMessagePreparator preparator = mimeMessage -> { mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(user.getEmail())); mimeMessage.setFrom(new InternetAddress(mailFromAddress)); StringBuilder sb = new StringBuilder(); sb.append("<ul>"); for (Task task : tasks) { sb.append("<li>").append(task.getCategory()).append(": ").append(task.getTitle()).append("</li>"); } sb.append("</ul>"); final String tasktext = sb.toString(); final Map<String,Object> model = getBaseModel(user); model.put("tasktext",tasktext); final String body = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"templates/sendReminder.vm",model); mimeMessage.setSubject("Kanbanboard WGM Task Reminder"); mimeMessage.setText(body,"html"); }; try { mailSender.send(preparator); log.info("Reminder Mail sent to {} containing {} tasks.",user.getEmail(),tasks.size()); } catch (MailException e) { log.error("Could not send mail to {}. The error was :",e); } }
/** * VeLocity 模板发送邮件 html 格式 * * @param to * @param subject * @throws javax.mail.MessagingException */ public void sendMailVeLocity(String from,String[] to,String subject) throws MessagingException { //如果不是 html 格式,修改为 SimpleMailMessage MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message,true,StandardCharsets.UTF_8.toString()); /** *邮件内容 */ helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); //模板内容 Map<String,Object>(); model.put("firstName","Yashwant"); model.put("lastName","Chavan"); model.put("location","china"); //创建动态 bean DynaBean dynaBean = new LazyDynaBean(); dynaBean.set("name","It is name"); //simple dynaBean.set("gender",new Integer(1)); //simple //设置 bean 属性 // VeLocity 工具类,实例可以直接放入 map,在模板文件中直接使用 // 如日期格式化 $datetool.format("yyyy-MM-dd",$info.issueTime) Datetool datetool = new Datetool();//日期工具 NumberTool numberTool = new NumberTool();//数字工具 model.put("datetool",datetool); model.put("numberTool",numberTool); model.put("bean",dynaBean); String text = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"./templates/veLocity_template_email-newsletter.vm",StandardCharsets.UTF_8.toString(),model); helper.setText(text,true); mailSender.send(message); }
@Override public void run(String... args) throws Exception { Map<String,Object>(); model.put("time",new Date()); model.put("message",this.message); System.out.println(VeLocityEngineUtils.mergeTemplateIntoString(this.engine,"welcome.vm",model)); }
@SuppressWarnings({ "rawtypes","unchecked" }) public void sendForgotPassword(User user,String code) { Map model = new HashMap(); model.put("user",user); model.put("code",code); String content = VeLocityEngineUtils.mergeTemplateIntoString(veLocityEngine,"templates/forgot_password.vm",model); String subject = "Change password for RotaryLive"; sendEmail(user.getMember().getEmail(),content,from,true); }
关于由于路径差异java,spring mvc,velocity而找不到JS / CSS文件和因为该路径太复杂的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于JAVA - ssm(SpringMVC,Spring,Mybatis)整合、java – Spring启动MVC:找不到JSP、mybatis springmvc velocity 环境搭建、org.springframework.ui.velocity.VelocityEngineUtils的实例源码的相关知识,请在本站寻找。
本文标签: