GVKun编程网logo

由于路径差异java,spring mvc,velocity而找不到JS / CSS文件(因为该路径太复杂)

8

如果您对由于路径差异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,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)整合

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

java – Spring启动MVC:找不到JSP

问题:我无法在我的 Spring Boot Web MVC应用程序的WEB-INF / 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

我究竟做错了什么?

解决方法

Zio,你确定你把这个依赖包括在你的pom上吗?
<dependency>
   <groupId>org.apache.tomcat.embed</groupId>
   <artifactId>tomcat-embed-jasper</artifactId>
   <scope>provided</scope>
</dependency>

没有这个,我得到了同样的错误.

mybatis springmvc velocity 环境搭建

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&amp;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的实例源码

org.springframework.ui.velocity.VelocityEngineUtils的实例源码

项目:sushi-bar-BE    文件:EmailSenderImpl.java   
@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);
}
项目:olat    文件:MailServiceImpl.java   
@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);
}
项目:spring4-understanding    文件:VeLocityConfigurerTests.java   
@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()));
}
项目:kanbanboard    文件:EMailServiceImpl.java   
@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);
    }
}
项目:kanbanboard    文件:EMailServiceImpl.java   
@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);
    }
}
项目:wonderjameeee    文件:VeLocityEmailSender.java   
/**
 * 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());
}
项目:communote-server    文件:XmppController.java   
/**
 * 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;
}
项目:Metaworks_framework    文件:VeLocityMessageCreator.java   
@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>");
}
项目:SparkCommerce    文件:VeLocityMessageCreator.java   
@Override
public String buildMessageBody(EmailInfo info,Object>");
}
项目:gisgraphy    文件:MailEngine.java   
/**
    * 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);
   }
项目:ldadmin    文件:MailEngine.java   
/**
 * 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);
}
项目:CAPortal    文件:VeLocityEmailSender.java   
@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);
}
项目:bedrock    文件:Mailer.java   
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);
    }
}
项目:blcdemo    文件:VeLocityMessageCreator.java   
@Override
public String buildMessageBody(EmailInfo info,Object>");
}
项目:olat    文件:MailServiceImpl.java   
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);
}
项目:javase-study    文件:MailServiceImpl.java   
@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);
}
项目:modules    文件:OpenMRSTaskDataProviderBuilder.java   
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;
}
项目:class-guard    文件:VeLocityConfigurerTests.java   
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()));
}
项目:class-guard    文件:VeLocityConfigurerTests.java   
public void testVeLocityConfigurerWithCsvPathAndNonFileAccess() throws IOException,new HashMap()));
}
项目:musicrecital    文件:MailEngine.java   
/**
 * 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);
}
项目:java-course-ee    文件:MailService.java   
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;
    }

}
项目:java-course-ee    文件:MailService.java   
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;
    }
}
项目:oauth2-provider    文件:MailSenderServiceImpl.java   
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;
}
项目:CoECI-OPM-Service-Credit-Redeposit-Deposit-Application    文件:BatchProcessingJob.java   
/**
 * 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);
    }
}
项目:Sonar-Email-Reports    文件:VeLocityEmailCreator.java   
/**
 * @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;
}
项目:timesheet-upload    文件:EmailServiceImpl.java   
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;
    }
}
项目:mumu    文件:SysIforgetController.java   
/**
 * 发送邮箱验证码
 * @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,"邮箱发送失败!");
}
项目:mmsns    文件:CommonEmailController.java   
/**
 * 发送邮箱验证码
 *
 * @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,"邮箱发送失败!");
}
项目:ctsms    文件:NotificationDaoImpl.java   
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;
    }
}
项目:iotplatform    文件:DefaultMailService.java   
@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);
}
项目:spring4-understanding    文件:VeLocityConfigurerTests.java   
@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()));
}
项目:mblog    文件:EmailSenderImpl.java   
@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);
}
项目:kanbanboard    文件:EMailServiceImpl.java   
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);
        }
    }
项目:spring-boot    文件:SpringMailService.java   
/**
 * 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);
}
项目:https-github.com-g0t4-jenkins2-course-spring-boot    文件:SampleVeLocityApplication.java   
@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));
}
项目:RotaryLive    文件:MailServiceImpl.java   
@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的实例源码的相关知识,请在本站寻找。

本文标签: