jstl视图_使用JSTL视图探索Spring Controller

jstl视图

让我们通过对Spring MVC的Controller开发的更多探索来改进我们以前的Spring JDBC应用程序 。 我将展示另一种编写新的Controller的练习,该Controller处理HTML表单并在JSP视图页面中使用JSTL标签。

要在Spring MVC应用程序中启用JSTL,您需要将以下内容添加到WebAppConfig配置类中。 让我们将其WebApp.java之外,并移至src/main/java/springweb/WebAppConfig.java它自己的顶级类文件中。

package springweb;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;@Configuration
@EnableWebMvc
@ComponentScan("springweb.controller")
public class WebAppConfig {@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver result = new InternalResourceViewResolver();result.setPrefix("/");result.setSuffix(".jsp");return result;}
}

InternalResourceViewResolver bean内,您定义在哪里可以找到其中包含JSTL标记的JSP页面。 prefix设置器是相对于您的src/webapp位置的路径。 如果需要,这可以让您完全隐藏JSP文件。 例如,通过将其设置为"/WEB-INF/jsp"您可以将所有JSP文件移动并存储到src/webapp/WEB-INF/jsp ,该文件在Web应用程序中是私有的。 suffix只是文件扩展名。 这两个值使您可以使用JSP文件的基本名称返回控制器内的视图名称,该名称可以缩写为“ / myform”或“ / index”等。

如果要将Tomcat用作Web容器,则还需要添加JSTL jar依赖项,因为Tomcat服务器不附带标准标记库! 因此,现在将其添加到pom.xml文件中。

<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>

当您使用pom.xml文件时,可能需要添加Tomcat maven插件,以便在运行Web应用程序时可以在命令行中键入更少的内容。

<project>
...<build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version></plugin></plugins></build>
...
</project>

这样,您应该可以在项目的根目录下运行mvn tomcat7:run ,而无需插件前缀。

那么JSTL给您的应用带来了什么? 好吧,实际上很多。 它使您可以使用在编写JSP视图时经常使用的一些标准JSP标记。 我将通过一组Controller和视图来演示这一点,以捕获来自应用程序的用户评论。 请注意,我将尝试仅以最基本的方式向您展示如何使用Spring Controller。 Spring实际上带有一个自定义form JSP标记,该标记使用起来功能强大得多。 我将在其他时间将其保留为另一篇文章。 今天,让我们集中精力学习更多有关基本Spring Controller和JSTL的知识,以及有关Spring JDBC数据服务的更多知识。

我们想要捕获用户评论,所以让我们添加一个数据库表来存储该信息。 将以下DDL添加到src/main/resources/schema.sql文件中。 同样,这是针对上一篇文章项目设置的H2数据库。

CREATE TABLE COMMENT (ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,TEXT VARCHAR(10240) NOT NULL,FROM_USER VARCHAR(15) NULL,FROM_USER_IP VARCHAR(15) NULL,FROM_URL VARCHAR(1024) NULL,TAG VARCHAR(1024) NULL,TS DATETIME NOT NULL
);

这次,我们将编写一个数据模型类来匹配该表。 让我们添加src/main/java/springweb/data/Comment.java

package springweb.data;import java.util.Date;public class Comment {Long id;String text;String fromUrl;String fromUser;String fromUserIp;String tag;Date ts;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getText() {return text;}public void setText(String text) {this.text = text;}public String getFromUrl() {return fromUrl;}public void setFromUrl(String fromUrl) {this.fromUrl = fromUrl;}public String getFromUser() {return fromUser;}public void setFromUser(String fromUser) {this.fromUser = fromUser;}public String getFromUserIp() {return fromUserIp;}public void setFromUserIp(String fromUserIp) {this.fromUserIp = fromUserIp;}public String getTag() {return tag;}public void setTag(String tag) {this.tag = tag;}public Date getTs() {return ts;}public void setTs(Date ts) {this.ts = ts;}private String getTrimedComment(int maxLen) {if (text == null)return null;if (text.length() <= maxLen)return text;return text.substring(0, maxLen);}@Overridepublic String toString() {return "Comment{" +"id=" + id +", ts=" + ts +", text='" + getTrimedComment(12) + '\'' +'}';}public static Comment create(String commentText) {Comment result = new Comment();result.setText(commentText);result.setTs(new Date());return result;}
}

就像以前的文章一样,我们将编写一个数据服务来处理数据模型的插入和检索。 我们添加一个新的src/main/java/springweb/data/CommentService.java文件

package springweb.data;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;import javax.sql.DataSource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Repository
public class CommentService {public static Log LOG = LogFactory.getLog(CommentService.class);private JdbcTemplate jdbcTemplate;private SimpleJdbcInsert insertActor;private RowMapper<Comment> commentBeanRowMapper = new BeanPropertyRowMapper<Comment>(Comment.class);@Autowiredpublic void setDataSource(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);this.insertActor = new SimpleJdbcInsert(dataSource).withTableName("COMMENT").usingGeneratedKeyColumns("ID");}public void insert(Comment comment) {LOG.info("Inserting Comment + " + comment);Map<String, Object> parameters = new HashMap<String, Object>(2);parameters.put("TEXT", comment.getText());parameters.put("FROM_USER", comment.getFromUser());parameters.put("FROM_USER_IP", comment.getFromUserIp());parameters.put("FROM_URL", comment.getFromUrl());parameters.put("TAG", comment.getTag());parameters.put("TS", comment.getTs());Number newId = insertActor.executeAndReturnKey(parameters);comment.setId(newId.longValue());LOG.info("New Comment inserted. Id=" + comment.getId());}public List<Comment> findComments() {String sql = "SELECT " +"ID as id, " +"TEXT as text, " +"TAG as tag, " +"TS as ts, " +"FROM_USER as fromUser, " +"FROM_USER_IP as fromUserIp, " +"FROM_URL as fromUrl " +"FROM COMMENT ORDER BY TS";List<Comment> result = jdbcTemplate.query(sql, commentBeanRowMapper);LOG.info("Found " + result.size() + " Comment records.");return result;}
}

由于我们没有使用任何花哨的ORM,而只是使用普通的JDBC,因此我们将不得不在数据服务中编写SQL。 但是要感谢Spring的好东西,它使诸如SimpleJdbcInsert助手使工作变得更加轻松,该助手处理数据库的插入和自动生成键的检索等。另外还要注意,在查询中,我们使用Spring的BeanPropertyRowMapper自动将JDBC结果集转换为Java bean Comment对象! 简单,直接,快速。

现在我们在src/main/java/springweb/controller/CommentController.java添加Spring控制器来处理Web请求。

package springweb.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import springweb.data.Comment;
import springweb.data.CommentService;import javax.servlet.http.HttpServletRequest;
import java.util.List;@Controller
public class CommentController {@Autowiredprivate CommentService commentService;@RequestMapping(value="/comments")public ModelAndView comments() {List<Comment> comments = commentService.findComments();ModelAndView result = new ModelAndView("/comments");result.addObject("comments", comments);return result;}@RequestMapping(value="/comment")public String comment() {return "comment";}@RequestMapping(value="/comment", method = RequestMethod.POST)public ModelAndView postComment(HttpServletRequest req, @RequestParam String commentText) {String fromUrl = req.getRequestURI();String user = req.getRemoteUser();String userIp = req.getRemoteAddr();Comment comment = Comment.create(commentText);comment.setFromUserIp(userIp);comment.setFromUser(user);comment.setFromUrl(fromUrl);commentService.insert(comment);ModelAndView result = new ModelAndView("comment-posted");result.addObject("comment", comment);return result;}
}

在此控制器中,我们映射/comment URL来处理HTML表单的显示,该表单返回comment.jsp视图。 该方法默认处理HTTP GET 。 请注意,我们在单独的postComment()方法上重新映射了相同的/comment URL来处理HTTP POST ! 在此演示中了解Spring Controller可以处理HTTP请求的程度。 非常注意postComment()方法中声明的参数。 Spring会根据声明的类型自动处理HTTP请求对象并映射到您的方法! 在某些情况下,您需要借助@RequestParam之类的注释来使其明确,但是Spring会为您解析HTTP请求和提取! 如果我们要编写直接的Servlet代码,则可以节省大量重复的样板代码。

现在让我们看一下视图以及如何使用JSTL。 /comments URL映射到src/main/webapp/comments.jsp视图文件,该文件将列出所有Comment模型对象。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:choose>
<c:when test="${empty comments}"><p>There are no comments in system yet.</p>
</c:when>
<c:otherwise><table border="1"><tr><td>INDEX</td><td>TIME</td><td>FROM</td><td>COMMENT</td></tr><c:forEach items="${comments}" var="comment" varStatus="status"><tr valign="top"><td>${status.index}</td><td>${comment.ts}</td><td>${comment.fromUserIp}</td><%-- The c:out will escape html/xml characters. --%><td><pre><c:out value="${comment.text}"/></pre></td></tr></c:forEach></table>
</c:otherwise>
</c:choose>

JSTL上的相当标准的东西。 接下来是HTML表单,用于在src/main/webapp/comment.jsp文件中发布评论。

<form action="comment" method="POST">
<textarea name="commentText" rows="20" cols="80"></textarea>
<br/>
<input type="submit" value="Post"/>
</form>

成功发布和处理表单后,我们只需返回src/main/webapp/comment-posted.jsp文件中的新页面作为输出。

<p>Your comment has been posted. Comment ID=${comment.id}</p>

如果您已正确完成这些操作,则应该可以运行mvn tomcat7:run并浏览http://localhost:8080/spring-web-annotation/comment以查看表单。 转到/comments URL以验证所有已发布的评论。

请注意,尽管我使用Spring Controller作为后端,但所有视图都在基本的JSTL中,甚至表单也只是基本HTML元素! 我这样做是为了让您看到Spring Controller有多灵活。

我知道今天有很多代码要发布到博客文章中,但是我想完整一些,并尝试显示带有教程笔记的有效演示。 我选择将其包含在文件内容中,而不是将项目下载到其他地方。 它使我的注释和解释更易于与代码匹配。

到此为止,我们今天的教程将结束。 如果您觉得有帮助,请留下笔记。

参考: A程序员杂志博客上的JCG合作伙伴 Zemian Deng从JSTL视图探索Spring Controller 。

翻译自: https://www.javacodegeeks.com/2013/10/exploring-spring-controller-with-jstl-view.html

jstl视图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/346045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php5.6 连接 oracle,XAMPP中PHP5.6.3连接Oracle

系统环境&#xff1a;Windows 8.1 x64PHP 5.6.3 x86Apache/2.4.10 (Win32)Oracle Database 11g Enterprise Editionxampp-win32-5.6.3-0-VC11-installer.exe 这个版本很坑爹… 在 php.ini 中只有extensionphp_oci8.dll ; Use with Oracle 10gR2 Instant Clientextensionphp_oci…

模型服务:流处理与使用Java,gRPC,Apache Kafka,TensorFlow的RPC / REST

机器学习/深度学习模型可以通过不同的方式进行预测。 我的首选方法是将分析模型直接部署到流处理应用程序&#xff08;如Kafka Streams或KSQL &#xff09;中。 您可以例如使用TensorFlow for Java API 。 这样可以实现最佳延迟和外部服务的独立性。 在我的Github项目中可以找到…

electronjs MySQL,javascript – 在Electron应用程序中使用sql.js.

我是Electron的新手.它非常棒,而且入门非常有趣而且非常简单.一段时间以来,我一直试图找到一个在我的应用程序中使用的“数据库”解决方案.当然有Web SQL /本地存储选项,但我试图使用SQLite.我找到了sql.js,它很棒且易于使用.我可以让一切正常运行放我无法保存/更新数据库文件&…

php ajax mysql 出错,MySql + PHP + Ajax的乱码问题的解决方案

现如今&#xff0c;基本的web2.0应用都会涉及到表现层、业务层、数据层等多个层次。在数据的来回传递中&#xff0c;新手一不注意就会产生汉字的乱码问题。汉字乱码主要是由于各层使用的编码、或在层间进行数据传输时使用的编码不一致造成的&#xff0c;釜底抽薪的解决办法就是…

读取csv文件 java_Java:逐步读取/流式传输CSV文件

读取csv文件 java我一直在做一些涉及读取CSV文件的工作&#xff0c;而我一直在使用OpenCSV &#xff0c;而我的最初方法是逐行读取文件&#xff0c;解析内容并将其保存到地图列表中。 当文件的内容适合内存时&#xff0c;此方法有效&#xff0c;但对于较大的文件来说是个问题&…

php+数组转换函数是,php数组与字符串的转换函数大全

4.在字符串种中查找另外一个字符使用strpos()或strstr()函数strpos() 函数返回字符串在另一个字符串中第一次出现的位置。如果没有找到该字符串&#xff0c;则返回 false。语法&#xff1a;//string为必须&#xff0c;表示被搜索的字符串//find为必须&#xff0c;表示被查找的字…

拥抱模块化Java平台:Java 10上的Apache CXF

Java 9版本终于将Project Jigsaw交付给大众已经过去了一年多的时间。 这是一段漫长的旅程&#xff0c;但是在那里&#xff0c;所以发生了什么变化&#xff1f; 这是一个很好的问题&#xff0c;答案并不明显和直接。 总的来说&#xff0c; 拼图项目是一种颠覆性的变化&#xff…

matlab sym转str,sym struct 转换

描述&#xff1a;用 sym() 生成了 矩阵&#xff1b; 再用 solve() 结果返回 结构体&#xff0c;还带sym 型。。。尝试&#xff1a;用 struct 转换 ; eval() 什么的 都无解&#xff0c;&#xff0c; (结构体还带sym。。。。昏了)求&#xff1a;怎…

php $r,PHP

本文实例为大家分享了php微信跳一跳的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 ?php require config.php; function similar($rgb1, $rgb2) { $r1 ($rgb1 16) $g1 ($rgb1 8) $b1 $rgb1 $r2 ($rgb2 16) $g2 ($rgb2 8) $b2 $rgb2 return abs($r1 - $r2) 1…

java 字符串对齐_最佳字符串对齐的Java实现

java 字符串对齐有一阵子&#xff0c;我使用了Levenshtein distance的Apache Commons lang StringUtils实现。 它实现了一些众所周知的技巧&#xff0c;通过仅挂接到两个数组而不是为备忘录表分配巨大的nxm表来使用较少的内存。 它还仅检查宽度为2 * k 1的“条带”&#xff0c;…

zabbix可以监控什么php,zabbix监控php

通过启用php-fpm的status页面&#xff0c;使用zabbix来获取各数据参数以达到监控php-fpm性能状态php-fpm配置配置文件php-fpm.confpm.status_path /fpmstatusping.path /fpmpingping.response pongnginx配置在配置的server内添加locationlocation ~ ^/(fpmstatus|fpmping) {…

建立无服务器的“ Hello World”功能

无服务器 &#xff0c;功能即服务&#xff08;FaaS&#xff09;或仅具有云功能&#xff0c;就可以编写将在云中运行的代码。 您可以使用多种不同的语言&#xff08;例如JavaScript&#xff08;Node.js&#xff09;&#xff0c;Swift&#xff0c;Python&#xff0c;Java&#xf…

oracle 10g 分区管理,Oracle 10g分区表的自动维护

Oracle 10g分区表不支持自动化管理&#xff0c;一般都要手动创建分区&#xff0c;手动删除。今天给大家带来了一个自动化管理表空间的脚本。本脚本主要由3个部分组成&#xff1a;sys_ConfigTable.sql、sys_pro_AddAndDropPartition.sql、sys_pro_MergeTable.sql1、sys_ConfigTa…

Oracle12如何重装,Oracle怎么重新安装?

实现方法&#xff1a;1、 开始&#xff0d;&#xff1e;设置&#xff0d;&#xff1e;控制面板&#xff0d;&#xff1e;管理工具&#xff0d;&#xff1e;服务 停止所有Oracle服务。2、 开始&#xff0d;&#xff1e;程序&#xff0d;&#xff1e;Oracle - OraHome81&#xff…

java实现metro风格_Metro风格的Java组合框(JMetro)–重新介绍

java实现metro风格我上一篇关于JMetro的文章–我的都市风格的Java皮肤&#xff08;或外观&#xff09;是关于日历选择器控件的 。 我本打算使用Tom Eugelink不错的日历选择器&#xff0c;但当时我了解到它是由Oracle创建并随Java 8一起提供的&#xff0c;因此出于时间的考虑&am…

Istio的网络API解释了

Istio 1.0版附带一个网络API&#xff0c;该API包含许多功能并涵盖了各种情况。 联网API在最近几个月中得到了发展&#xff0c;并且可能无法立即说明。 该API的概念和构建块是什么&#xff0c;以及如何使用各个Istio资源类型来通过我们的服务网格路由流量&#xff1f; 尽管文档…

toad查看oracle的plsql包,Oracle logminer 分析redo log(TOAD与PLSQL)

Oracle logminer 分析redo logOracle 11g r2 RAC centos 6.5设置时间格式select to_char(sysdate,yyyy-mm-dd hh24:mi:ss) date_format from dual ;查看数据库是否开启补全日志功能selectSUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEM…

php里面的mark,PHP CommonMarkCQL 用法 手册 | 示例代码

简介CommonMark Query Language is a DSL for describing how to travel through a CommonMark Node tree implemented as a parser and compiler for a small set of instructions, and a virtual machine for executing those instructions.Paths:In its most simplistic for…

spring 面向接口编程_Spring面向方面的编程

spring 面向接口编程介绍 在理想的面向对象系统中&#xff0c;我们希望将每个对象设计为执行一项特定任务。 但是&#xff0c;除了执行其主要任务之外&#xff0c;对象还执行被动任务&#xff0c;例如日志记录&#xff0c;事务&#xff0c;安全性&#xff0c;缓存等。这些被动活…

Nutshell中的Java 8语言功能-第2部分

编者注&#xff1a;您也可以在此处检查Part-1。 嗨&#xff0c;朋友们&#xff0c;这是简明系列的Java 8语言功能的第2部分。 在这里&#xff0c;我们将讨论Java 8的以下功能&#xff1a; 接口中的静态方法 流 1.接口中的静态方法 什么是静态方法&#xff1f; 静态方法是属…