java web/Maven项目结构:
1).src/main/java: 存放java源代码
2).src/main/resources:
2.1)ibatis映射文件xxxMapper.xml
2.2)spring/
spring-mvc.xml:
spring-mybatis.xml: mybatis配置+spring事务配置
spring-redis.xml :redis数据库配置
spring-security-cas.xml: spring security cas认证
spring-security.xml: spring seccurity 表单认证
2.3)appConfig.properties: 系统基本配置,包含数据库/redies等配置
2.4)log4j.properties: log4j的配置文件
2.5)spring-applicationContext.xml:默认名称为applicationContext.xml,为 spring 入口配置文件
3)src/test
4)Maven dependencies
5)JRre system Library
6)Apache Tomcat
7)JUnit
8)src/:
8.1)main/webapp/:
WEB-INF/
pages/
xx.jsp
resourcces/
xx.css
xxx.js
main.js
index.jsp
8.2)test
9)target:
10)build.xml:
11)pom.xml:
详解:
*. ibatis映射文件 HourlySchedMapper.xml
<mapper namespace="HourlySched">
<sql id="queryBasic">
<![CDATA[
//SQL statement
]]>
<choose>
<when test="xxxxx">
set @xx=xx;
</when>
<otherwise>
set @xxx= xxx;
</otherwise>
</choose>
<![CDATA[
//SQL statement
]]>
</sql>
<select id="retrieveDetail" parameterType="bean class" resultType="bean class">
<include refid="queryBasic"></include>
<![CDATA[
// SQL statement
]]>
</select>
</mapper>
该文件对应的控制层HourlySchedMgmtController.java中的retrievemaster方法会调用服务层SchedMgmtService中的retrieveMaster方法,该方法又会调用DAO层的selectList方法List selectList(String statement, Object parameter).例.第一个参数statement为"HourlySched.retrieveMaster", 可以看到HourlySched即为对应的ibatis文件字段的namespace的值,而retrieveMaster即为字段中的id值。
***注:. ibatis中用<![CDATA[ ]]>标记避免sql中与xml规范相冲突的字符对xml映射文件的合法性造成影响. CDATA全名为character data,指不使用XML解析器解析的文本数据其中包含的是指的是不应由xml解析器进行解析的文本数据
. choose标签是按顺序判断其内部when标签中的test条件出否成立,如果有一个成立,则 choose 结束。当 choose 中所有 when 的条件都不满则时,则执行 otherwise 中的sql。
. `: id为queryId的SQL一般是常用的或者是 可被其他SQL复用的部分,其他SQL只需要在需要的地方添加即可复用。
一个更加明白的例子:
<sql id="Base_Column_List" >
id, single_limit, day_limit, month_limit, state, bank_name, bank_code, channel
</sql>
<select id="selectByPrimaryKey" resultMap="***" parameterType="****" >
select
<include refid="Base_Column_List" />
from bank_limit
where id = #{id,jdbcType=INTEGER}
</select>
. SQL操作字段(update/insert/select/delete) 一般还需要parameterType和resultType两个字段,其中parameterType为输入参数元素的类型,resultType为查询结果元素的类型,二者不一定都有,类型一般为bean中定义的类。
. SQL可以包含特殊标记:$ #
$:将传入的数据直接显示生成Sql语句,实际上在动态SQL解析阶段进行了变量替换, KaTeX parse error: Expected 'EOF', got '#' at position 27: … #̲:将传入的值当作字符串,解析为…, 使用#可以很大程度上防止sql注入。(语句的拼接),但是如果使用在order by 中就需要使用 $.
*. applicationContext.xml配置文件分析
spring的入口配置文件:
<context:annotation-config />
:开启spring注解配置
<context:component-scan base-package="com.vxichina.wfmpx">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
:开启组件扫描,把controler下面的 controller去除, 如果不去除会影响事务管理的
注:exclude-filter用于在扫描时将base-package中的特定类型包排除,include-filter用于只对base-package指向的特定类型包进行扫描,一般Controller包会在spring-mvc.xml中进行扫描,其余的在applicationContext.xml中进行扫描,各司其职。
<context:property-placeholder location="classpath:appConfig.properties" />
:引入系统基本配置
<import resource="spring/spring-mybatis.xml" />
:mybatis配置——spring事务配置
<import resource="spring/spring-redis.xml" />
:redis数据库配置
<import resource="spring/spring-security.xml" />
: 表单认证
***控制器:
提供访问应用程序的行为,有两种方式:(1)服务接口定义(2)注解定义@RequestMapping ,
https://www.cnblogs.com/best/p/5659596.html?utm_source=tuicool&utm_medium=referral
其中:
(1)通过实现接口定义控制器,然后在springmvc-servlet.xml增加一个控制器bean的声明:其中,name是访问路径,class即为自定义控制器全称,其返回的模型视图对象中指定的路径为:“foo/index”。视图index.jsp位于WEB-INF/vews/foo目录下,浏览器请求:localhost:8080/SpringMVCxx/foox, 该方式缺点:一个控制器只能有一个Action,定义方式麻烦,
下面重点解释(2):
org.springframework.stereotype.Controller注解类型用于声明Spring类的实例BarController是一个控制器,使用时要在类 前面加上注解:
- @Controller
, Spring还提供了扫描机制来找到应用程序中所有基于注解的控制类,需要在Spring-mvc.xml中配置:<context:component-scan base-package="com.zhangguo.springmvc02" />
, 其中base-package用于指定扫描的基础包(缩小扫描范围),注解的方法前面加上:@RequestMapping("/bar"), 该方法返回String类型“foo/index”, 浏览器请求:localhost:8080/SpringMVC02/bar,
注:两种方式BarController和FooController同时指定一个视图foo/index.jsp, 页面的具体呈现结果取决于方法的内部实现,这里视图被复用,控制器和视图之间是弱耦合的。
- @RequestMapping
: 用于映射请求的url到控制器类或者一个特定的程序/方法 ,用于类上,表示类中所有响应请求的方法都是以改地址作为父路径。Spring提供的注解类位于org.springframework.web.bind.annotation下。可以只注解方法/同时注解类和方法/
@RequestMapping共有8个属性,其中,除了name之外,其余的都是数组类型,可以指定多个值,具体写法如下:
1)@RequestMapping("/action3/{p1}/{p2}") :将 注释方法的参数绑定到URI模板变量
public String action3(@PathVariable int p1, @PathVariable int p2, Model model) {//}
注:@RequestMapping("/foo")和@RequestMapping(path="/foo")相同
2)@RequestMapping(value="/action4/{id:\d{6}}-{name:[a-z]{3}}") : 正则要求id必须为6文数字,name必须为3位字母
public String action4(@PathVariable int id, @PathVariable String name, Model model) {//}
3)@RequestMapping(value="/action5/{name}") : 使用矩阵变量时,需要在springmvc-servlet.xml进行相应的配置
public String action5(Model model, @PathVariable String name, @MatrixVariable String r, @MatrixVariable(required=true) String g,@MatrixVariable(defaultVariable=“99”, required=false) String b) {//}
4)@RequestMapping(value="/action6/*.do"): Ant风格的路径模式,Ant通配符?/*/**/
public String action6(Model model) {}
5)@RequestMapping(value={"", “/page”, "page", “view/*”, "/msg"})*: 凡是满足{}中某一模式的URL请求都会由该方法进行处理
String indexMultipleMapping() {//}
6)@RequestMapping(value="/acton6", method={RequestMethod.POST, RequestMethod.DELETE}): 访问/action6请求的谓词类型必须为POST或者DELETE, 其他请求类型会显示405.
注:所有的请求默认(没有声明method)都是HTTP GET类型的,
7)@Controller
@RequestMapping("/home")
public class IndexController{
@RequestMapping(method=RequestMethod.GET)
String get() {
}
@RequestMapping(method=RequestMethod.DELETE)
String delete() {
}
// ...
}
所有处理方法会处理从/home进来的请求,到底调用那个方法取决于请求的类型
8) consumes用于指定处理请求的提交内容类型(即发送到服务器的Content-type)
@RequestMapping(value="/action8", consumes=“text/html”) : 请求的Content-type必须是text/html,否则报错415,
9) produces用于指定响应的Content-type,约束Accept类型,
@RequestMapping(value="/action9", produces=“application/json; charset=UTF-8”): 客户端可以接受的类型是application/jso且编码为utf-8,
注:多数浏览器Accept设置为*/*,接受任意类型
10)params用于指定请求中必须有特定参数与值
@RequestMapping(value="/action10", params={“id=215”, “name!=abc”}) :请求/action10路径必须包含id=215且name不等于abc
例,url:localhost:8080/SpringMVC02/home/action10?id=215&name=xyz, ok
11) header指定请求中必须有特定header值
@RequstMapping(value="/action11", headers=“Host=localhost:8078”):
例,url: localhost:8078/SpringMVC02/home/action11
12) name为当前映射制定一个名称,不常用
@RequestMapping(path={"/action12", “/myaction”}, name=“actionTest”)
例:url:localhost:8080/SpringMVC02/home/action12, ok
13)方法级注解,或者@RequestMapping的组合注解*
@GetMapping <=> @RequestMapping(method=RequestMethod.GET)
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
*.WEB-INF/下面的pages(JSP)和Resources(CSS/JS)
一个JSP页面可以由其他JSP页面拼接形成(子JSP页可以是某个JSP页面的一部分,包括成对标记可以 存在于两个JSP文件,但是要保证拼接后是完整的);
*.0) JSP页面的加载顺序
参考: https://blog.csdn.net/h2604396739/article/details/85176172
-
优先级:java>js=html;
-
写在<%%>中的Java代码(服务端运行的代码)优先加载;
-
jsp页面从上至下依次执行(javascript和html是浏览器端运行的代码 ),
-
<script>
标签里面的或者是引入的外部JS文件的执行顺序都是其语句出现的顺序,JS的执行过程也是页面装载的一部分;
window.ready
或者 ( f u n c t i o n ( ) / / ) 或 者 ‘ (function() { //})或者` (function()//)或者‘(document).ready(function() {// })`是文档DOM结构加载完成(不包含图片)之后执行; -
window.onload
是所有网页内容(包含图片等)加载完成之后才执行,并且该方法只能有一个
*.1) 插入Java代码:
共三种方式:
-
(1)通过引用变量的方式
<%=xxx%>: xxx可以为表达式或变量
-
(2)通过嵌入代码段的方式
<%
// Java代码片段
%>
-
(3)<%! 字段或方法声明 %>
例.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> //中文编码
<!DOCTYPE html>
<html>
<head><title>Hello World</title></head>
<body>
Hello World!<br/>
<%
System.out.println("Your IP address is " + request.getRemoteAddr());
%>
<p>今天的日期是: <%=(new java.util.Date()).toLocalString()%></p>
<%! int i=0; %>
</body>
</html>
*.2) 引入CSS文件:
<link rel="stylesheet" type="text/css" href="<%=basePath%>/resources/z_general/t3party/jquery.ui/1.12.1/jquery-ui.min.css"/>
*.3) 引入JS文件:
<script type="text/javascript" src="<%=basePath%>/resources/z_general/t3partyExtra/vue/2.5.17/vue.min.js"></script>
*.4) 插入java script代码:
<script>
var a = 1;
$(function() {
$('xxx').fuctName(function() {
//
});
});
var fuctName2 = function(parameters ) {
//
}
</script>
*.5)JSP页面常用标签:
参照: https://blog.csdn.net/xybelieve1990/article/details/48680075
-
*. EL(Expression Language)表达式:
语法结构:${} 运算符:[] 、 .
-
*. jstl(Java server page standard tag library)表达式:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 提供一般用头/条件/迭代/url标签: out/set/remove/catch | if/choose/when/otherwise/ | forEach/forTokens | import/url/redirect <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 使用那个taglib的标记时,加上相应的前缀:如,<c:forEacch></c:forEach>
-
*.struts-tags表达式:
<%@ taglib prefix="s" uri="/struts-tags"%>
-
*.Ognl(struts)表达式
包括:UI标签、非UI标签、ajax标签:xx | if/else if/ else/append/generator/Iterator/merge/sort/Subset/ + action/bean/date/debug/i18n/include/param/push/set/text/url/property | xxx UI标签中的表单标签包含很多通用属性:模板相关属性 + Javascript相关属性(onclick/ondbclick/onfocus/onchange....) + 通用属性
*.6) 注意JSP和HTML页面的区别
-
一个JS文件
-
一个CSS文件的定义参照:基础总结-CSS
*.pom.xml
`<properties>xxx</properties>`:字段定义框架的版本
`<dependencies><dependency>xxx</dependency><dependencies>`:字段定义各个框架的描述,可从Maven官网搜索和复制
其中,spring-context/spring-webmvc分别为Spring框架核心库和MVC, javax.servlet-api为Servlet核心包,jsp-api为JSP应用程序接口,注意scope字段的设置
```
<build></build>