Controller是MVC中的控制部分,主要的功能是接收客户端提交的请求,然后调用Service的功能及获取数据,最后返回View(视图,即JSP或freemarker页面)。
在Jspxcms中,Controller分为前台和后台。前台是普通用户浏览的页面,使用freemarker作为视图,通常不需要登录,比如网站首页、栏目页、专题页、搜索页等;后台一般为管理功能,使用JSP作为视图,需要管理员登录后台并且有相应权限,才能访问。
/src/main/resources/conf/plugin/plug/backend.xml
符合classpath:conf/**/backend*.xml
这个规则的文件会加载为后台Controller的配置文件。
<context:component-scan base-package="com.jspxcms.plug.web.back" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
</context:component-scan>
这个配置会自动加载com.jspxcms.plug.web.back
包下所有带有Controller
或ControllerAdvice
注解的类。
后台Controller返回JSP页面,JSP路径的前后缀分别为/WEB-INF/views/
、.jsp
,相应的配置文件是/src/main/resources/application.properties
。
# 后台JSP地址前缀
spring.mvc.view.prefix=/WEB-INF/views/
# 后台JSP地址后缀
spring.mvc.view.suffix=.jsp
后台访问地址以/cmscp
为根路径,@RequestMapping("/plug/resume")
和@RequestMapping("list.do")
配置的最终访问地址为/cmscp/plug/resume/list.do
。
/cmscp
路径由com.jspxcms.core.Application
中的new ServletRegistrationBean(backendDispatcherServlet(), "/cmscp/*");
代码设定。
后台Controller返回JSP页面,如plug/resume/resume_list
,加上前后缀,实际文件地址为/WEB-INF/views/plug/resume/resume_list.jsp
package com.jspxcms.plug.web.back;
@Controller
@RequestMapping("/plug/resume")
public class ResumeController {
@RequiresPermissions("plug:resume:list")
@RequestMapping("list.do")
public String list(...) {
...
return "plug/resume/resume_list";
}
@RequiresPermissions("plug:resume:create")
@RequestMapping("create.do")
public String create(...) {
...
return "plug/resume/resume_form";
}
...
}
com.jspxcms.plug.ContextConfig
中的@ComponentScan({"com.jspxcms.plug.web.fore" })
会加载com.jspxcms.plug.web.fore
包中的@Controller
类。
前台Controller返回的视图是FreeMarker,有关FreeMarker的配置在src/main/resources/context.xml
。
其中templateLoaderPath
是模板存储路径,也就是模板前缀,默认为/template
。
<!-- FreeMarker -->
<bean id="freeMarkerViewResolver" class="com.ujcms.common.freemarker.MyFreeMarkerViewResolver">
<property name="contentType" value="text/html; charset=UTF-8"/>
<property name="cacheUnresolved" value="false"/>
<property name="redirectHttp10Compatible" value="false"/>
</bean>
<!-- <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> -->
<bean id="freemarkerConfig" class="com.ujcms.common.freemarker.AdapterFreeMarkerConfigurer">
<property name="freemarkerVariables" value="#{propertiesHelper.getBeanMap('freemarkerVariables.')}"/>
<property name="templateLoaderPath" value="${templateStorePath}"/>
<property name="freemarkerSettings">
<props>
<prop key="tag_syntax">square_bracket</prop>
<prop key="template_update_delay">${freemarkerConfig.template_update_delay}</prop>
<prop key="defaultEncoding">UTF-8</prop>
<prop key="url_escaping_charset">UTF-8</prop>
<prop key="localized_lookup">false</prop>
<prop key="locale">zh_CN</prop>
<prop key="boolean_format">true,false</prop>
<prop key="datetime_format">yyyy-MM-dd'T'HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="time_format">HH:mm:ss</prop>
<prop key="number_format">0.###</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="auto_import">/spring.ftl as s</prop>
</props>
</property>
</bean>
前台访问地址直接以网站根路径为相对路径,@RequestMapping(value = "/resume")
配置的访问地址就为/resume
。
前台返回的FreeMarker模板路径,一般返回当前站点的模板路径,如/1/default/plug_resume.html
,加上模板前缀,实际地址是/template/1/default/plug_resume.html
;
也可以是任意值,如:/abc/def.html
,加上模板前缀,实际地址为/template/abc/def.html
。
package com.jspxcms.plug.web.fore;
@Controller
public class ResumeController {
public static final String TEMPLATE = "plug_resume.html";
@RequestMapping(value = "/resume")
public String form(HttpServletRequest request, org.springframework.ui.Model modelMap) {
...
// 将通用对象放到modelMap里,如ctx dy user site global等
Map<String, Object> data = modelMap.asMap();
ForeContext.setData(data, request);
// 获得当前站点对象
Site site = Context.getCurrentSite();
// 返回当前站点模板路径。如:/1/default/plug_resume.html。加上模板前缀,实际地址是 /template/1/default/plug_resume.html
return site.getTemplate(TEMPLATE);
}
@RequestMapping(value = "/resume", method = RequestMethod.POST)
public String submit(...) {
...
}
}